在尝试在ruby中创建引脚时,如何修复NoMethodError?

时间:2013-07-01 15:55:33

标签: ruby-on-rails ruby ruby-on-rails-3 error-handling scaffolding

请原谅我可能天真,这是我第一次使用StackOverflow并且我正在尝试学习ruby。我正在通过onemonthrails.com的教程制作一个类似于pinterest的教程。我正在尝试添加一个引脚,我不断收到错误:

Pins#new

中的NoMethodError

显示/Users/jake/code/omrails/app/views/pins/_form.html.erb第5行提出:

未定义的方法`描述'为# 提取的来源(第5行):

我不知道什么都会帮助你回答这个问题所以当我运行以下命令时,我会发布我收到的所有文件(可能与问题相关): $ rails生成脚手架针脚

迁移文件:

class CreatePins < ActiveRecord::Migration
  def change
    create_table :pins do |t|
      t.string :description

      t.timestamps
    end
  end
end

模特:

class Pin < ActiveRecord::Base
  attr_accessible :description
end

_form.html.erb :(这是发现错误的地方)

<%= simple_form_for(@pin) do |f| %>
  <%= f.error_notification %>

  <div class="form-inputs">
    <%= f.input :description %>
  </div>

  <div class="form-actions">
    <%= f.button :submit %>
  </div>
<% end %>

new.html.erb :(这是“模板结论的痕迹”)

<h1>New pin</h1>

<%= render 'form' %>

<%= link_to 'Back', pins_path %>

我不明白错误,因为我认为该方法是在attr_accessible下的模型中定义的:description

如果你能理解我刚才所说的话,我将非常感谢你的帮助。如果不是因为花时间去看它。

3 个答案:

答案 0 :(得分:1)

您需要运行迁移才能创建pins表。

 rake db:migrate

如果它抱怨该表存在,则表示您在添加description列之前运行了迁移。如果没有首先恢复迁移,重新运行迁移将无法运行:

 rake db:migrate:redo

澄清您关于attr_accessible :description - attr_accessible的观点,定义模型的属性。您的数据库表就是这样(通常根据您的迁移)。 attr_accessible所做的是充当群组可分配属性的白名单。

答案 1 :(得分:0)

我假设您在创建脚手架后没有rake db:migrate。先尝试一下。

  

我不明白错误,因为我认为该方法已定义   在attr_accessible下的模型中:description

attr_accessible :description声明实际上并未定义该方法。 ActiveRecord会根据您pins表中的列为您做这件事。如果您没有运行迁移(因此创建表),ActiveRecord将无法在您的模型上自动生成属性方法,这很可能导致您看到的错误。

attr_accessible声明您的属性可通过质量分配进行设置。通常,当您在控制器中执行此操作时:@pin = Pin.new params[:pin]其中params[:pin]是模型属性的哈希值。

答案 2 :(得分:0)

您可以查看包含pins列的数据库表“description”吗?如果没有,请尝试删除上一个表格并尝试使用description列创建新表格。

或者您可以创建迁移文件来更新现有表格,例如:

rails g migration add_description_to_pins

然后在这个文件里面:

class AddDescriptionToPins < ActiveRecord::Migration
  def self.up
    add_column :pins, :description, :string
  end

  def self.down
    remove_column :pins, :description
  end
end