不确定为什么表单中的第一个参数不能包含 nil 或为空
Unsure why First argument in form cannot contain nil or be empty
这应该很简单,但我似乎无法指出错误的确切原因。
场景如下:
- 用户填写表格。
- 在嵌套属性中,用户提交了超过 3 个赏金的表单。这会触发 "rescue ActiveRecord::NestedAttributes::TooManyRecords"。
- 应将用户重定向回表单,同时保留所有先前输入的信息。
代码如下所示:
posts/new/_form.html.erb
<%= form_for @post, html: { multipart: true } do |f| %>
posts_controller.html.erb
def new
@post = Post.new
@bounty = Bounty.new
end
def create
begin
@post = Post.new(post_params)
@post.creator = current_user
if @post.save
flash[:notice] = "Your post was created."
redirect_to posts_path
else
flash[:error] = 'Opps, something went wrong.'
render :new
end
rescue ActiveRecord::NestedAttributes::TooManyRecords
flash[:error] = 'Too many bounties.'
render :new
end
end
但是上面的代码在触发 "TooManyRecords" 错误时会产生 "First argument in form cannot contain nil or be empty" 错误。另一方面,"Opps, something went wrong." 的错误工作正常。
提前感谢您花时间查看问题。
修复方法如下:
rescue ActiveRecord::NestedAttributes::TooManyRecords
flash[:error] = 'Too many bounties.'
@post = Post.new
@bounty = Bounty.new
render :new
end
您必须在呈现之前为您的 'new' 表单初始化 @post 变量。由于异常发生在 Post.new(post_params) 调用中,当您呈现表单时,@post 当前为 nil。
此版本将从表单中删除信息。要保留该信息,您需要调用 Post.new 并使用修改后的 post_params 版本去除赏金。如果不知道您的参数的详细信息,我无法告诉您它应该是什么样子。
经过反复试验,我决定不走救援之路。相反,为此创建了自定义验证。不,除了防止用户添加超过 3 个嵌套属性之外,还会保留信息。问题已解决。
validate :bounty_limit
def bounty_limit
errors.add(:base, "You sir, are generous for planning to give more than 3!") if bounties.size > 3
end
但是@PeterGoldstein,谢谢你回答我的问题。
这应该很简单,但我似乎无法指出错误的确切原因。
场景如下:
- 用户填写表格。
- 在嵌套属性中,用户提交了超过 3 个赏金的表单。这会触发 "rescue ActiveRecord::NestedAttributes::TooManyRecords"。
- 应将用户重定向回表单,同时保留所有先前输入的信息。
代码如下所示:
posts/new/_form.html.erb
<%= form_for @post, html: { multipart: true } do |f| %>
posts_controller.html.erb
def new
@post = Post.new
@bounty = Bounty.new
end
def create
begin
@post = Post.new(post_params)
@post.creator = current_user
if @post.save
flash[:notice] = "Your post was created."
redirect_to posts_path
else
flash[:error] = 'Opps, something went wrong.'
render :new
end
rescue ActiveRecord::NestedAttributes::TooManyRecords
flash[:error] = 'Too many bounties.'
render :new
end
end
但是上面的代码在触发 "TooManyRecords" 错误时会产生 "First argument in form cannot contain nil or be empty" 错误。另一方面,"Opps, something went wrong." 的错误工作正常。
提前感谢您花时间查看问题。
修复方法如下:
rescue ActiveRecord::NestedAttributes::TooManyRecords
flash[:error] = 'Too many bounties.'
@post = Post.new
@bounty = Bounty.new
render :new
end
您必须在呈现之前为您的 'new' 表单初始化 @post 变量。由于异常发生在 Post.new(post_params) 调用中,当您呈现表单时,@post 当前为 nil。
此版本将从表单中删除信息。要保留该信息,您需要调用 Post.new 并使用修改后的 post_params 版本去除赏金。如果不知道您的参数的详细信息,我无法告诉您它应该是什么样子。
经过反复试验,我决定不走救援之路。相反,为此创建了自定义验证。不,除了防止用户添加超过 3 个嵌套属性之外,还会保留信息。问题已解决。
validate :bounty_limit
def bounty_limit
errors.add(:base, "You sir, are generous for planning to give more than 3!") if bounties.size > 3
end
但是@PeterGoldstein,谢谢你回答我的问题。