Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.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 尝试迭代关联模型时,CollectionProxy始终有一个nil条目_Ruby On Rails_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails 尝试迭代关联模型时,CollectionProxy始终有一个nil条目

Ruby on rails 尝试迭代关联模型时,CollectionProxy始终有一个nil条目,ruby-on-rails,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 4,我的主要模型Activity有适当的数据 >> @activity => #<Activity id: 4, name: "Take a nap", description: "Let your kids sleep when they're tired", location: "home", duration_minutes: 60, created_at: "2014-01-01 20:32:56", updated_at: "2014-01-01 20:32:56"

我的主要模型Activity有适当的数据

>> @activity
=> #<Activity id: 4, name: "Take a nap", description: "Let your kids sleep when they're tired", location: "home", duration_minutes: 60, created_at: "2014-01-01 20:32:56", updated_at: "2014-01-01 20:32:56">
如果我把一些数据放进去,我会得到我添加的真实数据,但我仍然会得到这个nil集合代理小丑

>> @reviews
=> #<ActiveRecord::Associations::CollectionProxy [#<Review id: 5, rating: 5, reviewer_name: "Peter", activity_id: 4, description: "I can be productive when the kids are sleeping.", created_at: "2014-01-05 03:53:08", updated_at: "2014-01-05 03:53:08">, #<Review id: nil, rating: nil, reviewer_name: nil, activity_id: 4, description: nil, created_at: nil, updated_at: nil>]>
>> @reviews.any?
=> true
>> @reviews.count
=> 1
>@评论
=> #
>>@reviews.any?
=>正确
>>@reviews.count
=> 1
所以,我的问题是,我的关联有什么错,我一直得到这个无用的nil CollectionProxy条目

另外,我刚刚查看了postgres控制台,没有损坏的记录,有关联(activity_id=4),但没有数据

幕后:

/模型/活动.rb

class Activity < ActiveRecord::Base
  has_many :reviews
end
类活动
/models/review.rb

class Review < ActiveRecord::Base
  belongs_to :activity
end
class Review
如您所述,
CollectionProxy
对象不是
nil
@activity
实际上有一个
Review
——问题是
Review
id
nil
。不确定这是如何发生的,但您可以从Rails控制台纠正这一点:

# from command line, enter `rails console` to enter the console
Review.find(nil).destroy

@activity.reviews的执行点在一个展示页面上,在一张表单的后面。看起来,form_for创建了一个新的activity.review。它不会被保存/创建,只是在当时。因此,它只是创建了垃圾,这给了我CollectionProxy,它基本上为零,但具有当前活动的活动id

<h2>Add a review</h2>
<%= form_for([@activity, @activity.reviews.build]) do |f| %>
    <div class="field">
        <%= f.label :rating %><br>
        <%= f.number_field :rating %>
    </div>
    <div class="field">
        <%= f.label :reviewer_name %><br>
        <%= f.text_field :reviewer_name %>
    </div>
    <div class="field">
        <%= f.label :description %><br>
        <%= f.text_area :description %>
    </div>
    <div class="actions">
        <%= f.submit %>
    </div>
<% end %>


<h2>Reviews</h2>
<% @reviews.each do |review| %>
    <p><%= "#{review.reviewer_name} - #{review.rating} - #{review.description}"%></p>
<% end %>
添加评论



评论

为zeantsoi和Broisaze干杯,因为他们帮助我走上了解决这个问题的正确道路


我的选择是在添加审核之前移动审核,或者添加一些进一步的零检查。

它不是零,它是一个空模型。它不是自己到达那里的,是有人把它放在那里的。你能展示整个动作+模型吗?但愿如此:
>查看。查找(nil)
#如果数据库中有什么有趣的事情,我只是宣布数据破产,用
rake DB:reset
,然后。。。我仍然有这个问题。这是有道理的,因为错误在视图中。因为您引用了Rails控制台中的代码片段,所以我假设错误在控制台/控制器中。提及错误的位置/性质可能会在将来引发更简洁的错误。感谢您提供关于更清晰问题的建议。这是从我的视图输出的,使用gems better_errors和绑定_的_调用者,您可以在视图错误中获得一个控制台。我可怜的人的调试包括一些类似于
@reviews.to_explosion
的东西,以便在特定断点处给我一个控制台。
<h2>Add a review</h2>
<%= form_for([@activity, @activity.reviews.build]) do |f| %>
    <div class="field">
        <%= f.label :rating %><br>
        <%= f.number_field :rating %>
    </div>
    <div class="field">
        <%= f.label :reviewer_name %><br>
        <%= f.text_field :reviewer_name %>
    </div>
    <div class="field">
        <%= f.label :description %><br>
        <%= f.text_area :description %>
    </div>
    <div class="actions">
        <%= f.submit %>
    </div>
<% end %>


<h2>Reviews</h2>
<% @reviews.each do |review| %>
    <p><%= "#{review.reviewer_name} - #{review.rating} - #{review.description}"%></p>
<% end %>