“无法找到没有 ID 的 <object>”

jon*_*nic 8 forms comments ruby-on-rails ruby-on-rails-3

我在实现一种评论表单时遇到问题,其中评论(称为“微博”)属于用户和帖子,用户有_许多评论,帖子(称为“提议”)有_许多评论。

我的评论表单代码是:

<%= form_for @micropost do |f| %>
  <div class="field">
      <%= f.text_area :content %>
  </div>

  <div class="actions">
    <%= f.submit "Submit" %>
  </div>
<% end %>
Run Code Online (Sandbox Code Playgroud)

MicropostsController 在创建操作中有这个:

  def create

      @proposition = Proposition.find(params[:proposition_id])

  @micropost = current_user.microposts.build(params[:micropost])
  @micropost.proposition = @proposition
  if @micropost.save
      flash[:success] = "Contribution submitted"
      redirect_to root_path
  else
          @feed_items = []    
      render 'pages/home'
  end
  end
Run Code Online (Sandbox Code Playgroud)

创建新微博的表单与提议在同一页面上,但提议 id 似乎在任何时候都没有通过。

这是我在提交微博表单时遇到的错误:

ActiveRecord::RecordNotFound in MicropostsController#create

找不到没有 ID 的提案

参数是:

{"commit"=>"Submit", "micropost"=>{"proposition_id"=>"", "content"=>"第一条评论"}, "authenticity_token"=>"TD6kZaHv3CPWM7xLzibEbaLJHI0Uw43H+pq88HLZFjc=", "utf8" =>"âœ""}

我对 Rails 完全陌生,对编码任何东西都非常陌生,所以如果你能给我任何帮助,我将不胜感激!

提前致谢。

apn*_*ing 3

你的参数是:

"micropost"=>{"proposition_id"=>"", "content"=>"First comment"}
Run Code Online (Sandbox Code Playgroud)

所以要得到proposition_id,你必须这样做:

params[:micropost][:proposition_id]
Run Code Online (Sandbox Code Playgroud)

但这是空的。而且没有其他地方可以得到这个id,这就是这一行检索的原因nil

@proposition = Proposition.find(params[:proposition_id])
Run Code Online (Sandbox Code Playgroud)

使这个失败:

@micropost.proposition = @proposition
Run Code Online (Sandbox Code Playgroud)

您必须:

  • 添加proposition_id作为hidden_field

  • 将其存储在会话中

但我对您的背景了解不够,无法在这里为您提供正确的解决方案。

编辑:

在您的链接中,替换:

<%= f.hidden_field :proposition_id %>
Run Code Online (Sandbox Code Playgroud)

和:

<%= f.hidden_field :proposition_id, :value => @proposition.id %>
Run Code Online (Sandbox Code Playgroud)

如果不起作用,请显示您的参数。

注意:依赖实例变量是不好的做法,您应该将局部变量发送到每个部分