何时在Ruby on rails上调用对象创建?

时间:2014-04-30 15:03:06

标签: ruby-on-rails ruby new-operator authlogic

    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;方法。我无法在整个代码中的任何地方看到此方法被调用。我指的是以下示例项目

railscasts/160-authlogic

请告诉我这个对象是如何创建的。

感谢。

3 个答案:

答案 0 :(得分:4)

newcreate 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

由于您是初学者,我强烈建议您:

  1. 阅读 Getting Started with Rails ,这将有助于您了解Rails应用程序开发的基础知识。
  2. 然后,我还建议您完成 Learn Rails by Example By Michael Hartl
  3. 最后,观看 Ruby on Rails Railscasts By Ryan Bates
  4. 虽然,你可以在Google上搜索,你会发现许多Rails初学者的优秀资源,但上面的3个是事实上的。

答案 1 :(得分:0)

UserSessionsController中,newcreate方法引用与特定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帮助程序可以为您完成所有工作。