【问题标题】:In Rails 3.1 How do I create a select list for a form that has a belongs_to association?在 Rails 3.1 中,如何为具有 belongs_to 关联的表单创建选择列表?
【发布时间】:2012-01-03 04:06:40
【问题描述】:

GIST 在这里: https://gist.github.com/1553371

这些是我拥有的模型:

class Character < ActiveRecord::Base
  has_many :weapons
end

class Weapon < ActiveRecord::Base
  belongs_to :character
end

这就是我在 HAML 中的看法:

= form_for(@weapon) do |f|
  %ul.fields
    %li
      = f.label :character
      = collection_select :weapon, :character_id, Character.all, :id, :name, {:prompt => 'Please Select a Character.'}

但我不断收到此错误:

undefined method `character_id' for #<Weapon:0x007f9033232088>

我尝试为character_id 使用字符串,但也没有用。表单使用:character 呈现,但当然它不会保存回来,因为它需要id

【问题讨论】:

    标签: ruby-on-rails ruby forms activerecord haml


    【解决方案1】:

    您的代码看起来不错,很可能您的武器模型上没有character_id 字段。如果你这样做了,那么你有待运行的迁移需要运行。

    您可以通过查看db/schema.db 来检查数据库的当前状态,它会显示您是否有 character_id 列。

    您可以使用rake db:migrate 运行您的迁移,然后使用rake db:test:prepare 来更新您的测试数据库。

    如果在运行迁移后它不起作用,那么您需要创建一个,应该类似于:

    # db/migrations/add_character_id_to_weapons.rb
    class AddCharacterIdToWeapons < ActiveRecord::Migration
      def change
        add_column :weapons, :character_id, :integer
      end
    end
    

    【讨论】:

    • 我避免添加新的迁移,因为文档似乎暗示有一些轨道魔法应该自动添加 _id 列,我害怕把事情弄得更糟,但这完全有效。非常感谢!
    【解决方案2】:

    API 文档:

    collection_select(method, collection, value_method, text_method, options = {}, html_options = {})
    

    所以你想要

    f.collection_select( :character_id, Character.all, :id, :name, {:prompt => 'Please Select a Character.'} )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-09
      相关资源
      最近更新 更多