Cześć
w dzisiejszym odcinku chciałbym pokazać wam jak zbudować prosty formularz do zapisywania danych w ruby on rails.
Na potrzeby tego wideo nie będę tych danych nigdzie wyświetlać potrzebujemy je tylko zapisać.
W kontrolerze, nazwijmy go ContactMessagesController
potrzebujemy mieć metodę new
oraz create
. New to miejsce, gdzie router prowadzi do naszego formularza, create będzie zapisywać nasze dane.
Jeżeli tak jak ja dopiero utworzyliście ten controler, nie zapomnijcie o routerze.
resources :contact_messages, only: %i(new create)
w ten sposób dostępne będą tylko dwa adresy
teraz potrzebujemy utworzyć widok dla naszego formularza
w katalogu views
musimy utworzyć contact_messages
a w nim plik new.html.erb
erb to html rozszerzony o kod w języku ruby (po za erb popularnymi formatami jest jeszcze haml i slim, bez wątpienia przyspieszają one pisanie widoków, jeden i drugi format ma swoich zwolenników, polecam poszukać)
jak wynika z nazwy to będzie formularz dla jakiś kontaktowych wiadomości
najprostsze co możemy zrobić to coś takiego
<h1>Zostaw wiadomość</h1>
<%= form_with model: @contact_message do |form| %>
<div>
<%= form.label :title %><br>
<%= form.text_field :title %>
</div>
<div>
<%= form.label :body %><br>
<%= form.text_area :body %>
</div>
<div>
<%= form.submit %></div>
<% end %>
nasz formularz będzie miał tytuł i treść
wróćmy teraz do naszego controllera, musimy zmienić pustą metodę new na:
def new
@contact_message = ContactMessage.new
end
oraz create
def create
@contact_message = ContactMessage.new(message_params)
redirect_to new_contact_message_path
end
z racji tego, że nie mamy metody show, po utworzeniu wiadomości i tak będzie przenosić do formularza
potrzebujemy jeszcze utworzyć message_params
private
def message_params
params.require(:contact_message).permit(:title, :body)
end
jeżeli włączymy serwer i przejdziemy na localhost:3000/contact_messages/new to zobaczymy nasz formularz, problem jest tylko taki, że nie mamy jeszcze modelu o nazwie ContactMessage
zanim go utworzę chciałbym jeszcze kilka rzeczy zmienić w naszym formualrzu
<h1>Zostaw wiadomość</h1>
<%= form_with model: @contact_message do |form| %>
<div>
<%= form.label :name %><br>
<%= form.text_field :name %>
</div>
<div>
<%= form.label :email %><br>
<%= form.email_field :email %>
</div>
<div>
<%= form.label :title %><br>
<%= form.text_field :title %>
</div>
<div>
<%= form.label :body %><br>
<%= form.text_area :body %>
</div>
<div>
<%= form.check_box :terms %>
<%= form.label :terms, "Akceptuje regulamin, zgadzam się na przetwarzanie danych" %>
</div>
<div>
<%= form.submit %></div>
<% end %>
po pierwsze przydało by się dodać jakieś imię osoby kontatkowej
po drugie jeżeli chcemy jej odpisać przydał by się jej email, form ma helper email_field
który waliduje czy wpisywana wartość to email. A na koniec jeszcze dodajmy checkbox, że nasz kontaktujący zgadza się na przetwarzanie danych. Bo bez tego to w sumie nie powinniśmy tych danych zapisywać.
teraz w kontrolerze musimy zmienić nasze parametry
private
def message_params
params.require(:contact_message).permit(:name, :email, :title, :body)
end
w metodzie create możemy jeszcze zmienić tak:
def create
unless params[:contact_message][:terms] == "1"
flash[:notice] = 'Musisz wyraźić zgodę na przetwarzanie danych'
else
@contact_message = ContactMessage.new(message_params)
if @contact_message.save
flash[:notice] = 'Wiadomość zapisana'
else
flash[:notice] = 'Coś poszło nie tak'
end
end
redirect_to new_contact_message_path
end
w ten sposób powiadomimy usera o tym co się dzieje
a na górze naszego layoutu musimy dodać
<% flash.each do |name, msg| %>
<%= content_tag :div, msg, class: name %>
<% end %>
teraz już wszystko będzie ok, nie pozostaje nam nic innego jak utworzenie modelu
możemy się posłużyć generatorem
rails g model ContactMessage name:string email:string title:string body:text
możecie zauważyć, że nie mamy pola terms, bo nie jest nam potrzebne nie jest to informacja która zapisujemy w bazie danych
Pamiętajcie o migracji rails db:migrate
by nie było problemów z naszymi danymi w modelu warto dodać walidacje
validates :name, presence: true
validates :email, presence: true
validates :title, presence: true
validates :body, presence: true
teraz możemy wrócić do naszego formularza localhost:3000/contact_messages/new i go zapisać
zobaczmy czy warunek z terms działa
zapiszmy dane
i na koniec sprawdźmy czy rzeczywiście tam są
rails c
ContactMessage.last
To by było na tyle, w następnym odcinku pokaże wam jak po za zapisaniem tego w bazie danych wysłać ten formularz na maila
Miłego kodowania!