我正在尝试通过以下方式构建用户注册表单 迈克尔哈特的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
感谢您的时间。
答案 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"}