将@user变量添加到新操作的原因(def new @user = User.new end)

时间:2014-09-21 08:47:50

标签: ruby-on-rails-4

我正在尝试通过以下方式构建用户注册表单   迈克尔哈特的Rubyonrails书。 Chapter 7:Singup

然而,我根本无法绕过这一小段代码。

def new 
    @user = User.new
  end

我想知道上面代码的用途是什么以及它是如何工作的?

如果我故意排除上面的代码(@ user = User.new),它会抛出错误信息:

raised: First argument in form cannot contain nil or be empty

如果表单中的第一个参数不能包含nil或为空,为什么声明@ user = User.new会传递,因为它将nil值赋给用户对象。我对rails的天真理解可能是错误的。

这是完整的代码

控制器/ user_controller.rb

class UsersController < ApplicationController
  def show
    @user = User.find(params[:id])
  end  

  def new 
    @user = User.new
  end

   def create
     @user = User.new(user_params)   # Not the final implementation!
    if @user.save
      flash[:success] = "Welcome to the Sample App!"
      redirect_to @user

    else
      render 'new'
    end
  end

  private

    def user_params
      params.require(:user).permit(:name, :email, :password,
                                   :password_confirmation)
    end
end

视图/用户/ new.html.erb

         

      &lt;%= form_for(@ user)do | f | %GT;           &lt;%= render'shared / error_messages'%&gt;

  <%= f.label :name %>
  <%= f.text_field :name %>

  <%= f.label :email %>
  <%= f.text_field :email %>

  <%= f.label :password %>
  <%= f.password_field :password %>

  <%= f.label :password_confirmation, "Confirmation" %>
  <%= f.password_field :password_confirmation %>

  <%= f.submit "Create my account", class: "btn btn-large btn-primary" %>
<% end %>   </div> </div>

在向可敬的stackoverflow社区提出这些问题之前,我在以下链接中寻找答案: -

http://railscasts.com/episodes/250-authentication-from-scratch

First argument in form cannot contain nil or be empty Hartl's Rails 4 Tutorial

In Ruby on Rails Restful Authentication, UsersController#new, a @user = User.new is used. Is it actually needed?

感谢您的时间。

2 个答案:

答案 0 :(得分:1)

行中会发生什么

def new 
  @user = User.new
end

是,rails正在创建一个名为@user的实例变量(ruby对实例变量使用@符号)并分配一个新的User模型。这可能是

User模型的大部分时间

app/models/user.rb

然后传递到您的视图#app/vies/users/new.html.erb

并记住,初始化新的User对象并分配到@user与将nil值分配给@user

不同

然后是你的第二个问题,为什么当你故意排除它时会出错。

所以背后的原因是,

当你说@user = User.new并将@user变量传递给rails form_helper时。 (<%= form_for(@user) do |f| %>),所以form_helper自动给你一些东西,

如果您获得该页面的html源代码,它就像

<form action="/users" id="new_user" method="post"> </form>

这意味着rails form helper正在为您创建routes,post方法(post)等。来自您的<%= form_for(@user) do |f| %>行。正如您现在已经明白的那样,如果您只是传递'nil via @ user = nil , rails form_helper`无法完成所有处理工作,那就是您遇到上述错误的原因。

详细了解form helpers,HTH

答案 1 :(得分:0)

键入

  

@user = User.new

您使用空字段创建Model对象用户。此变量是此对象的实例变量,您可以在视图中访问它,并在表单字段中使用它

form_for(@user)

视图中表单中的字段是指定此变量的字段,但变量不能为nil。如果你没有变量@user,你可以使用任何其他变量并按符号设置它。 form_for 的变量必须是实例变量(以@开头)或在.erb文件中指定

当您提交表单时,您会发送散列,其中变量具有带字段的哈希值 的 PARAMS {"utf8"=>"✓", "authenticity_token"=>"xxx=", "user"=>{"email"=>"qwerty@qwerty.qw", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"Create user"}