不确定为什么表单中的第一个参数不能包含 nil 或为空

Unsure why First argument in form cannot contain nil or be empty

这应该很简单,但我似乎无法指出错误的确切原因。

场景如下:

  1. 用户填写表格。
  2. 在嵌套属性中,用户提交了超过 3 个赏金的表单。这会触发 "rescue ActiveRecord::NestedAttributes::TooManyRecords"。
  3. 应将用户重定向回表单,同时保留所有先前输入的信息。

代码如下所示:

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,谢谢你回答我的问题。