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

时间:2011-06-02 13:56:51

标签: ruby-on-rails ruby-on-rails-3 forms comments

我在实施一种评论表时遇到问题,其中评论(称为“微博”)属于用户和帖子,用户有很多评论,帖子(称为“命题”)有很多评论。

我的评论表格代码是:

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

  <div class="actions">
    <%= f.submit "Submit" %>
  </div>
<% end %>

MicropostsController在create action中有这个:

  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

用于创建新微博的表单与命题位于同一页面上,但命题ID似乎在任何时候都没有通过。

这是我提交微博表单时出现的错误:

  

ActiveRecord :: RecordNotFound in   MicropostsController#创建

     

无法找到命题   ID

参数是:

  

{ “提交”=&gt; “中提交”,   “微柱”=&GT; { “proposition_id”=&gt; “中”,   “content”=&gt;“First comment”},   “authenticity_token”=&gt; “中TD6kZaHv3CPWM7xLzibEbaLJHI0Uw43H + pq88HLZFjc =”,   “UTF8”=&gt;“中AOE“”}

我对rails很陌生,对编码任何东西都很陌生,所以我很感激你能给我的任何帮助!

提前致谢。

2 个答案:

答案 0 :(得分:2)

你的参数是:

"micropost"=>{"proposition_id"=>"", "content"=>"First comment"}

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

params[:micropost][:proposition_id]

但这是空的。并且没有其他地方可以获得此id,这就是此行检索nil的原因:

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

使此失败:

@micropost.proposition = @proposition

您必须:

  • proposition_id添加为hidden_field

  • 将其存储在会话

但我不知道你的背景足以在这里给你正确的解决方案。

编辑:

In your link,替换:

<%= f.hidden_field :proposition_id %>

使用:

<%= f.hidden_field :proposition_id, :value => @proposition.id %>

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

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

答案 1 :(得分:1)

正如您所看到的,proposition_id参数为空,因此除非您为其提供有效的ID,否则您的控制器无法找到该命题。

您需要确保new表单发送proposition_id属性。一种方法是:

  1. 在控制器的new操作中设置命题:@micropost.proposition = ...

  2. 在表单中,为ID添加隐藏字段:f.hidden_field :proposition_id

  3. create操作中,使用params[:micropost][:proposition_id]

  4. 找到合适的提案

    (您还需要确保在您的Micropost模型中使用attr_accessible,并确保proposition_id不在该列表中。否则,您将面临令人讨厌的安全漏洞。请参阅http://www.kalzumeus.com/2010/09/22/security-lessons-learned-from-the-diaspora-launch/Which fields should be protected from mass assignment?

    编辑(由于评论):

    你的新动作应该是这样的:

    def new
      @micropost = Micropost.new
      @micropost.proposition_id = params[:proposition_id]
    

    这与上述内容略有不同,这是因为您将请求中的命题ID发送给new。没有必要查找实际的命题记录,因为我们只对id字段(我们已经拥有)感兴趣。