#ruby-on-rails #forms
#ruby-on-rails #формы
Вопрос:
Я пытаюсь изучить Ruby on Rails. Я следовал руководству YouTube, чтобы создать простую аутентификацию в ruby. Все работает нормально, но я не могу этого понять.
У меня есть маршруты
resources :sessions, only: [:new, :create, :destroy]
get 'signup', to: 'users#new', as: 'signup'
get 'login', to: 'sessions#new', as: 'login'
get 'logout', to: 'sessions#destroy', as: 'logout'
У меня есть контроллеры для сеансов и пользователей
sessions_controller
def new
end
def create
user = User.find_by_email(params[:email])
if user amp;amp; user.authenticate(params[:password])
session[:user_id] = user.id
redirect_to root_url, notice: 'Logged in !'
else
render :new
end
end
def destroy
session[:user_id] = nil
redirect_to root_url, notice: 'Logged out!'
end
и мои просмотры / сеансы / new.html.erb
<h1>Log In</h1>
<%= form_tag sessions_path do %>
<div class="field">
<%= label_tag :email %><br>
<%= text_field_tag :email %>
</div>
<div class="field">
<%= label_tag :password %><br>
<%= password_field_tag :password %>
</div>
<div class="actions">
<%= submit_tag "Log In" %>
</div>
<% end %>
Я хочу понять, как работает моя форма входа. Я понимаю, что когда я захожу в / login, он запрашивает действие у контроллера сеанса и метода new, но как он узнает, когда я ввожу свой адрес электронной почты и пароль и нажимаю отправить, что делать дальше? В php есть . Как это работает в ruby?
Комментарии:
1.
In php there is .
не могли бы вы уточнить, пожалуйста? ^^2. Извините, я хотел вставить: в php есть <form action=»/sessions» method=»post»>
Ответ №1:
Это довольно широкий вопрос, но я попытаюсь объяснить некоторые из rails-magic, которые вы, вероятно, захотите узнать.
Во-первых, вам следует более внимательно ознакомиться с документами viewhelper, особенно form_tag . Он создаст html-тег формы с sessions_path в качестве первого аргумента и do-block в качестве второго. sessions_path
является ли вспомогательным средством просмотра, предоставляемым rails, потому что вы использовали
resources :sessions, only: [:new, :create, :destroy]
в ваших маршрутах. Он возвращает строку, которая должна выглядеть следующим "/sessions"
образом . Вы должны взглянуть на это руководство, чтобы лучше понять маршрутизацию rails.
<%= form_tag sessions_path do %>
...
<% end %>
это то же самое, что
<form action="/sessions" method="post">
...
</form>
Итак, отправка — это не что иное, как обычная html-форма отправки в «/ sessions». Rails сопоставит запрос post с «/ sessions» методу SessionsController #create, где мы аутентифицируем пользователя по электронной почте и паролю и устанавливаем идентификатор в сеансовом файле cookie
if user amp;amp; user.authenticate(params[:password])
session[:user_id] = user.id
# ...
Комментарии:
1. Единственное, чего я не понимаю, это откуда он знает, что ему нужно использовать метод SessionsController#create, а не какой-либо другой метод?
2. Хорошо, если я введу rake routes, я увижу, что путь /sessions сопоставлен с sessions#create
3. Потратьте некоторое время, чтобы прочитать это, и вы поймете, как он знает, какой контроллер и действие загружать: guides.rubyonrails.org/routing.html
4. Спасибо @Chris Peters, подойдет
Ответ №2:
В дополнение к хорошему ответу Ninigi я просто хотел добавить это…
ресурсы: сеансы, только: [:создать, :создать,:уничтожить]
будет генерировать маршруты, которые вы можете просмотреть, используя rake routes
в терминале.
Кроме того, form_tag и т. Д. — Это просто помощники для просмотра, которые будут генерировать html, Просто используйте inspect element в вашем браузере, чтобы увидеть, что он сделал.
Я бы добавил это в качестве комментария, но у меня пока недостаточно репутации.
Ответ №3:
Очень хорошей отправной точкой для понимания этого будет книга «Учебник по Ruby on Rails» Майкла Хартла. Его можно бесплатно читать онлайн.
См. Главу 7 и далее для входа / регистрации и т. Д.
Пошаговые объяснения очень полезны.
Ссылка: https://www.railstutorial.org/book
и добро пожаловать в RoR