【问题标题】:How do I fix NoMethodError when trying to create a pin in ruby?尝试在 ruby​​ 中创建 pin 时如何修复 NoMethodError?
【发布时间】:2013-07-01 15:55:32
【问题描述】:

对不起,我可能太天真了,这是我第一次使用 StackOverflow,我正在尝试学习 ruby​​。我正在通过 onemonthrails.com 的类似于 pinterest 的教程制作应用程序。我正在尝试添加图钉,但一直收到错误消息:

引脚中的 NoMethodError#new

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

# 的未定义方法“描述” 提取的源代码(第 5 行附近):

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

迁移文件:

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

如果您能理解我刚才所说的任何内容,我将不胜感激。如果不是,感谢您花时间查看它。

【问题讨论】:

  • 你能告诉我们你是如何设置@pin的吗?

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


【解决方案1】:

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

 rake db:migrate

如果它抱怨表存在,这意味着您在添加description 列之前运行了迁移。如果不先恢复迁移,则无法重新运行迁移:

 rake db:migrate:redo

为了澄清您关于attr_accessible :description 的观点 - attr_accessible 是否没有为您的模型定义属性。您的数据库表会这样做(通常根据您的迁移)。 attr_accessible 所做的是充当可批量分配属性的白名单。

【讨论】:

  • 是的,我已经运行了 rake db:migrate,当我刚才再次运行它时,它给了我一个错误,SQLite3::SQLException: table "pins" already exists: CREATE TABLE "pins"
  • @josephreed:您可能在将 description 列添加到迁移之前运行了它,请参阅更新。
  • 我做到了。我跑了 $ rails generate scaffold Pins 但后来意识到老师跑了 $ rails generate scaffold Pins description:string --skip-stylesheets 所以我做了同样的事情来添加描述,这就是一切都陷入困境的地方
  • 当我尝试还原它时,它给了我完全相同的错误并中止迁移
  • 有没有办法删除脚手架并重新开始?
【解决方案2】:

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

我不理解错误,因为我认为方法已定义 在 attr_accessible 下的模型中:描述

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

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

【讨论】:

  • 是的,我已经运行了 rake db:migrate,当我刚才再次运行它时,它给了我一个错误,SQLite3::SQLException: table "pins" already exists: CREATE TABLE "pins"
  • 有没有办法删除脚手架并重新开始?
【解决方案3】:

您能检查一下具有description 列的数据库表“pins”吗?如果没有,请尝试删除以前的表并尝试使用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

【讨论】:

  • 如何完全放下我的桌子并重新开始?我尝试添加您的文件,但它没有工作,我仍然无法 rake db:migrate
  • 尝试DROP TABLE pins进入数据库控制台。为什么不使用一些数据库浏览器,例如:phpmyadmin?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-12
  • 2020-07-05
  • 1970-01-01
  • 2019-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多