我正在尝试学习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 && 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 %>
我想了解登录表单的工作原理。我明白,当我去/登录它会请求会话控制器和方法新的动作,但它如何知道我何时输入我的电子邮件和密码并按提交下一步做什么?在PHP中有。它如何在红宝石中起作用?
答案 0 :(得分:2)
这是一个相当广泛的问题,但我会尝试解释你可能想知道的一些铁轨魔法。
首先,你应该仔细看看the viewhelper docs, especially form_tag。它将创建一个表单html标记,其中sessions_path作为第一个参数,do-block作为第二个参数。
sessions_path
是一个视图帮助程序,由rails提供,因为您使用了
resources :sessions, only: [:new, :create, :destroy]
在您的路线中。它返回一个看起来像这个"/sessions"
的字符串。你应该更好地看看this guide to understand rails routing。
<%= form_tag sessions_path do %>
...
<% end %>
与
相同<form action="/sessions" method="post">
...
</form>
因此,提交只不过是提交给&#34; / sessions&#34;的常规html表单。 Rails会将一个帖子请求映射到&#34; / sessions&#34;到SessionsController #create方法,我们通过电子邮件和密码对用户进行身份验证,并在会话cookie中设置id
if user && user.authenticate(params[:password])
session[:user_id] = user.id
# ...
答案 1 :(得分:2)
除了Ninigi的好答案,我只想补充一点......
资源:仅限会话:[:new,:create,:destroy]
将生成您可以使用终端中的rake routes
查看的路线。
另外form_tag等只是生成html的视图助手,只需在浏览器中使用inspect元素即可查看它已经完成的工作。
我会将此作为评论添加,但我还没有足够的声誉。
答案 2 :(得分:2)
理解这一点的一个非常好的起点将是Michael Hartl的Ruby on Rails Tutorial。它可以免费在线阅读。
有关登录/注册等信息,请参阅第7章。
逐步解释非常有用。
链接:https://www.railstutorial.org/book
欢迎来到RoR