2015-01-02 27 views
0

我想了解我有一些我的Rails项目中遇到的问题。我有两个型号,嵌套模型尺寸较大(+1),比过去在Rails的

第一招:

class Donkey < ActiveRecord::Base 
    has_many :comments, dependent: :destroy 

    validates :name, :surname, :age, presence: true 
end 

第二个:

class Comment < ActiveRecord::Base 
    belongs_to :donkey 

    validates :comment, :commenter, presence: true 
end 

我的问题是我之前添加一条记录评论模式,@ donkey.comments.size为1并且返回的对象是零。

要从此逃避我使用,

<% @donkey.comments.each do |comment| %> 
    <p><strong><%= comment.commenter %></strong></p> 
    <p><%= comment.comment %></p> 

    <% if comment.id.present? %> 

    <p><%= link_to 'Destroy Comment', donkey_comment_path(@donkey, comment), 
       method: :delete, data: { confirm: 'Do you really want to delete this question?' } %></p> 

    <% end %> 

<% end %> 

上面的代码我的视图文件,如果你留意,你可以看到我使用if语句没有得到一个错误。 (零对象)

我的 '添加注释' 从视图文件在下面的代码,

<%= form_for([@donkey, @comment]) do |f| %> 
    <p><%= f.label :commenter %>: <%= f.text_field :commenter %></p> 
    <p><%= f.label :comment %>: <%= f.text_area :comment %></p> 
    <%= f.submit %> 
<% end %> 

而且@comment = @ donkey.comments.build在我的控制器。

我想了解这个错误,这就是为什么我做了这样一个简单的模型。我正在检查SQL服务器中没有记录,但@ donkey.comments.size为1且没有对象。

任何人都可以帮助我在这个问题上?

非常感谢您的宝贵时间,

+0

您是否尝试过创建驴在控制台中留言以隔离问题是否存在于模型中? – lcguida

+0

感谢您的回复@rockskull。我销毁了开发数据库并再次迁移并登录到rails控制台,并从那里创建了Donkey和Comment记录=>结果是有一条记录,但大小为2.模型中存在什么问题?这很简单,你可以看到上面..真的很好奇:( – manorie

回答

0

你会build在你的控制器评论的原因是这样你就可以访问它在你看来,它然后与上提交的形式发送。

如果您在视图中使用form.fields_for来访问您试图以该窗体创建的主对象的关系,则这是一种常见模式。在你的情况@donkey将是你的主要对象,你会得到访问一个comment在您看来,您可以遍历@donkey.comments,你总是会得到至少一个显示。

的问题是,您要添加到您的@donkey.comments列表非持久性注释,它目前还没有一个id所以,当你提到在这里

donkey_comment_path(@donkey, comment)

一切爆炸。

所以,你正在做正确的事情在检查其是否具有和身份证先到这里

<% if comment.id.present? %>

,但更多的“Rails的路”将是要么

<% if comment.persisted? %>

<% unless comment.new_record? %>

通知unless上述

看到这里的API这个东西http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-persisted-3F

希望这不会使它变得更加复杂;)

+0

非常感谢您的解释,我发现最后的错误,但我认为在控制器中创建一个新的空注释不能与以前记录的对象混合在一起感谢分享Rails的方式与我:) – manorie

0

开放轨控制台,并尝试这一点,并找到什么是对

> @donkey = Donkey.find(1) 
> @donkey.comments 
> @donkey.comments.inspect 
> @donkey.comments.size 
+0

感谢您的评论。Rails控制台给出,irb(main):004:0> @ donkey.comments.size => 0但在视图中它仍然显示大小为1 ,如此奇怪:( – manorie

+0

好吧,你使用任何调试工具/宝石即pry-rails,pry-byebug? 或RubyMine的调试工具? 如果是的话,你可以使用binding.pry(放置中断点),看看是什么去那里 – illusionist

0

去它就是这么奇怪,

当我删除

@comment = @donkey.comments.build 

from DonkeyController and change <%= form_for from([@keykey,@c omment])do | f | %>到,

form_for([@donkey, @donkey.comments.build]) do |f| 

错误消失。

你觉得我需要打开这个错误机票还是我做错了什么,宣布内部控制@comment。