我在实施一种评论表时遇到问题,其中评论(称为“微博”)属于用户和帖子,用户有很多评论,帖子(称为“命题”)有很多评论。
我的评论表格代码是:
<%= 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很陌生,对编码任何东西都很陌生,所以我很感激你能给我的任何帮助!
提前致谢。
答案 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
属性。一种方法是:
在控制器的new
操作中设置命题:@micropost.proposition = ...
在表单中,为ID添加隐藏字段:f.hidden_field :proposition_id
在create
操作中,使用params[:micropost][:proposition_id]
(您还需要确保在您的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
字段(我们已经拥有)感兴趣。