【问题标题】:Reason for adding an @user variable to the new action(def new @user = User.new end)将@user 变量添加到新操作的原因(def new @user = User.new end)
【发布时间】:2014-09-22 12:34:33
【问题描述】:

我正在尝试通过以下方式构建用户注册表单 Michael Hart 的 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

views/users/new.html.erb

  <%= 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?

感谢您的宝贵时间。

【问题讨论】:

    标签: ruby-on-rails-4


    【解决方案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。 (&lt;%= form_for(@user) do |f| %&gt;),所以form_helper会自动给你一些东西,

    如果你得到页面的 html 源代码,它会是这样的

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

    这意味着 Rails 表单助手正在为您创建 routes、post 方法 (post) 等。来自您的&lt;%= form_for(@user) do |f| %&gt;。正如您现在可能已经理解的那样,如果您只是通过 'nilvia@user = nil, railsform_helper` 无法完成所有处理工作,这就是您收到上述错误的原因。

    阅读更多关于form helpers,HTH

    【讨论】:

    • 为了更深入的理解阅读sameera207推荐的form helpers是必须的。
    【解决方案2】:

    当你输入时

    @user = User.new

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

    form_for(@user)
    

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

    当您提交表单时,您会发送哈希,其中变量具有哈希字段,例如 参数 {"utf8"=&gt;"✓", "authenticity_token"=&gt;"xxx=", "user"=&gt;{"email"=&gt;"qwerty@qwerty.qw", "password"=&gt;"[FILTERED]", "password_confirmation"=&gt;"[FILTERED]"}, "commit"=&gt;"Create user"}

    【讨论】:

      猜你喜欢
      • 2019-09-19
      • 2012-10-11
      • 2019-04-20
      • 2014-01-09
      • 2023-03-15
      • 2015-12-25
      • 2015-05-16
      • 1970-01-01
      • 2022-08-19
      相关资源
      最近更新 更多