Ruby on rails &引用;不能';找不到<;对象>;没有身份证”;
我在实现一种评论表单时遇到了问题,在这种表单中,评论(称为“微帖子”)同时属于用户和帖子,用户有很多评论,而帖子(称为“命题”)有很多评论 我的评论表代码为:Ruby on rails &引用;不能';找不到<;对象>;没有身份证”;,ruby-on-rails,ruby-on-rails-3,forms,comments,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.sub
<%= form_for @micropost do |f| %>
<div class="field">
<%= f.text_area :content %>
</div>
<div class="actions">
<%= f.submit "Submit" %>
</div>
<% end %>
创建新micropost的表单与命题在同一页上,但命题id似乎在任何时候都没有通过
这就是我在提交micropost表单时遇到的错误:
ActiveRecord::RecordNotFound在中
MicropostsController#创建
找不到没有
身份证
参数包括:
{“提交”=>“提交”,
“micropost”=>{“命题id”=>“”,
“内容”=>“第一条评论”},
“真实性令牌”=>“TD6kZaHv3CPWM7xLzibEbaLJHI0Uw43H+pq88HLZFjc=”,
“utf8”=>“utf8”}
我对rails完全陌生,对编码任何东西都很陌生,所以如果您能给我任何帮助,我将不胜感激
提前感谢。您的参数是:
"micropost"=>{"proposition_id"=>"", "content"=>"First comment"}
因此,要获得命题id
,您必须执行以下操作:
params[:micropost][:proposition_id]
但是这是空的。并且没有其他地方可以获取这个id
,这就是为什么此行检索nil
:
@proposition = Proposition.find(params[:proposition_id])
使其失败:
@micropost.proposition = @proposition
您必须:
- 添加
作为proposition\u id
hidden\u字段
- 将其存储在会话中
<%= f.hidden_field :proposition_id %>
与:
@proposition.id%>
如果不起作用,显示你的参数
注意:依赖实例变量是不好的做法,您应该向每个部分发送局部变量,正如您所看到的,
proposition\u id
参数为空,因此您的控制器无法找到该命题,除非您给它一个有效的id
您需要确保您的new
表单发送proposition\u id
属性。一种方法是:
new
操作中设置命题:@micropost.proposition=…
f。隐藏字段:命题id
create
操作中,使用params[:microspost][:Proposition\u id]
attr\u accessible
,并确保proposition\u id
不在该列表中。否则,您将面临严重的安全漏洞。请参阅和)
编辑(由于评论):
您的新操作应如下所示:
def new
@micropost = Micropost.new
@micropost.proposition_id = params[:proposition_id]
这与上面所说的略有不同,这是因为您在请求中将命题id发送到
new
。无需查找实际命题记录,因为我们只对id
字段感兴趣(我们已经有了该字段).谢谢David!我现在在控制器中的“新建”操作中添加了1.'@proposition=proposition.find(params[:proposition\u id]);在表单中添加了2.'@proposition=proposition.find(params[:proposition\u id])我希望这就是你的意思。我在Microposts控制器中也有“attr_accessible:content”-但我仍然得到相同的错误!知道为什么吗?这都是在github上完成的。我在这里添加了这些代码,但仍然导致相同的错误-我不知道为什么…抱歉我的无知程度。Tha谢谢你的帮助David。我已经设法用Apreading的解决方案实现了这一点,但我怀疑有一种不使用隐藏表单字段的方法可以做到这一点…谢谢-我添加了一个隐藏字段,但仍然不起作用。它在github上:。--如果你能告诉我为什么Vim一直创建所有这些交换文件以及如何停止,请告诉我!感谢您的编辑。当我(使用)进行此更改时,我收到错误消息“undefined method`merge'for 34:Fixnum”-34是我希望表单传递给控制器的命题的ID。此代码的语法是否有问题?
<%= f.hidden_field :proposition_id, :value => @proposition.id %>
def new
@micropost = Micropost.new
@micropost.proposition_id = params[:proposition_id]