class UserSessionsController < ApplicationController
def new
@user_session = UserSession.new
end
def create
@user_session = UserSession.new(params[:user_session])
if @user_session.save
flash[:notice] = "Successfully logged in."
redirect_to root_path
else
render :action => 'new'
end
end
RoR的新手,我一直在研究传统的c / c ++,所以我对对象创建和东西有一些基本的疑虑, 在UserSessionsController中有两种方法,即&#34; new&#34;和&#34;创建&#34;。在&#34; new&#34;方法创建UserSession的对象,不带任何参数,并在&#34;创建&#34;方法再次使用某个参数创建对象。
最初我认为&#34;新&#34;方法是多余的并删除它。但我收到了以下错误
调用id为nil,错误地为4 - 如果你真的想要id为nil,请使用object_id
如果我包含&#34; new&#34;方法。我无法在整个代码中的任何地方看到此方法被调用。我指的是以下示例项目
请告诉我这个对象是如何创建的。
感谢。
答案 0 :(得分:4)
new
和create
是 CRUD 的一部分。
new
操作用于呈现new
的{{1}}视图。在UserSessionsController
操作中,您只需使用new
创建UserSession
模型类的实例。在此之后,将呈现@user_session = UserSession.new
( * 是模板处理程序,如erb,haml等),您将在其中输入您想要创建的new.html.***
对象的详细信息。提交此表单后,将调用UserSession
个动作。
在create
操作中,您使用create
收集从new
视图传递的参数,当您说@user_session = UserSession.new(params[:user_session])
时,实际上会在数据库表中创建记录{ {1}}
<强>更新强>
单击 Login Link 时会调用@user_session.save
操作。为什么要调用它?因为您已在 routes.rb
user_sessions
由于您是初学者,我强烈建议您:
虽然,你可以在Google上搜索,你会发现许多Rails初学者的优秀资源,但上面的3个是事实上的。
答案 1 :(得分:0)
在UserSessionsController
中,new
和create
方法引用与特定RESTful HTTP请求(路由)对应的控制器操作。在这种情况下,GET /user_sessions/new
HTTP请求将调用UserSessionsController#new
,而POST /user_sessions
HTTP请求将调用UserSessionsController#create
。
new
操作会呈现表单(在views/user_sessions/new.html.erb
处找到)以创建新的用户会话。该视图希望您提供@user_session
的用户会话对象,该对象由new
语句在控制器的@user_session = UserSession.new
操作中完成。如果没有该行,视图将尝试使用nil
对象引用呈现表单,从而导致错误。
create
操作处理来自new
的表单提交。它希望看到适合UserSession
的属性哈希。使用该属性哈希调用UserSession.new
,创建一个填充了提交表单中数据的新UserSession
。在save
实例上调用UserSession
会运行验证,这可能会失败。您可以看到,如果保存成功,控制器将使用&#34; Success!&#34;将用户重定向到根URL。 flash消息。如果失败,它会将用户返回到表单以修复错误。
答案 2 :(得分:0)
&#39; new&#39;动作通常与用户界面结合使用,用户界面将接受来自用户的输入,例如表格。新操作创建一个新的UserSession对象并不是绝对必要的,但是如果你想使用&#34; form_for&#34;帮手。
<% form_for @user_session do |f| %>
如您所见,如果未定义@article,则此表单将引发错误。使用form_for的好处是,当您提交表单并将表单数据发送到创建操作时,rails会自动为您生成正确的参数。例如:
<% form_for @user_session do |f| %>
<%= f.label :user_session %><br />
<%= f.text_field :user_session %>
<p><%= f.submit "Submit" %></p>
<% end %>
当您提交表单时,此表单将创建一个参数user_session [:user_session]。现在,当你打电话:
@user_session=UserSession.new(params[:user_session])
@user_session对象将其user_session属性自动设置为表单传入的值。当只有一个属性时,这可能看起来微不足道,但是在具有许多属性的表单中,实例化新对象并将所有属性设置在一行中的能力很好。
可以手动重新创建此功能,但form_for帮助程序可以为您完成所有工作。