为什么一直说未定义的方法?

时间:2016-12-19 12:14:43

标签: ruby-on-rails ruby ruby-on-rails-4

创建了两个模型....模型中也提到了关联。

第一个模型是Item,第二个模型是Activity。

项目型号代码:

class Item < ActiveRecord::Base
    has_many :activities
end

活动模型代码:

class Activity < ActiveRecord::Base
    belongs_to :item
end

我可以通过链接显示每个项目.....现在我想要对该特定项目进行活动,为此我创建了一个控制器,它是&#34;活动&#34;然后我写了代码,如下:

活动型号代码:

class ActivitiesController < ApplicationController
    def create
    @item = Item.find(params[:item_id])
    @activity = @item.activities.create(activity_params)
    redirect_to items_path(@item)
  end

  private
    def activity_params
      params.require(:activity).permit(:task)
    end
end

项目控制器的show.html.erb代码如下:

Show.html.erb(Items_controller)代码:

<h1>Show Goal</h1>

<p>
  <strong>Goal: </strong>
  <%= @item.goal %>
</p>

<p>
  <strong>Description: </strong>
  <%= @item.description %>
</p>

<h2>Activity</h2>
<% @items.activities.each do |activity| %>
  <p>
    <strong>Activity:</strong>
    <%= activity.task %>
  </p>

<% end %>

<h2>Add a Activity:</h2>
<%= form_for([@item, @item.activities.build]) do |f| %>
  <p>
    <%= f.label :Task %><br>
    <%= f.text_field :task %>
  </p>
    <%= f.submit "Add Activity"%>
  </p>
<% end %>


<%= link_to 'Edit', edit_item_path(@item) %>
<%= link_to  "Back" , items_path %>

错误来自这一行,它说&#34;未定义的方法`活动&#39;为零:NilClass&#34;

<% @items.activities.each do |activity| %>

&#34;活动&#34>的迁移代码模型

迁移活动模型代码:

class CreateActivities < ActiveRecord::Migration
  def change
    create_table :activities do |t|
      t.string :task


      t.timestamps null: false
    end
  end
end

现在我无法弄清楚这个错误来自哪里&#34;未定义的方法`活动&#39;为零:NilClass&#34; .... ????????

4 个答案:

答案 0 :(得分:1)

@items为零,因为您只定义了@item

答案 1 :(得分:1)

错误说"undefined method activities' for nil:NilClass" 哪个是正确的@items nil

回到控制器@item,有一个错字

另外检查迁移文件,在Activity的迁移文件中,如果没有使用

删除迁移,则应该有项item_id的外键。

rake db:migrate:down VERSION=migration number

并编辑该文件并重新运行rake db:migrate

答案 2 :(得分:0)

将以下行替换为

<% @items.activities.each do |activity| %>

<% @item.activities.each do |activity| %>

答案 3 :(得分:0)

您需要创建迁移,以便将item的引用添加到activity

rails g migration AddItemToActivities item:references

然后您的文件应如下所示:

class AddItemToActivities < ActiveRecord::Migration
  def change
    add_reference :activities, :item, index: true
  end
end

然后你可以通过这种方式轻松循环:

<% @item.activities.each do |activity| %>
...