Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails &引用;不能';找不到<;对象>;没有身份证”;_Ruby On Rails_Ruby On Rails 3_Forms_Comments - Fatal编程技术网

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=…

  • 在表单中,为id添加一个隐藏字段:
    f。隐藏字段:命题id

  • create
    操作中,使用
    params[:microspost][:Proposition\u id]

  • (您还需要确保在Micropost模型中使用
    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]