1

type列に単一テーブルの継承を持つモデルがあります。

class Pet < ActiveRecord::Base
  TYPES = [Dog, Cat, Hamster]
  validates_presence_of :name
end

<select>新規ページと編集ページにドロップダウンを提供したい:

<% form_for @model do |f| %>
  <%= f.label :name %>
  <%= f.text_input :name %>

  <%= f.label :type %>
  <%= f.select :type, Pet::TYPES.map { |t| [t.human_name, t.to_s] } %>
<% end %>

それは私に次のエラーを与えます:

ActionView::TemplateError (wrong argument type String (expected Module))

Ruby予約#type語を#class. 両方試してみました

class Pet < ActiveRecord::Base
  ...
  alias_attribute :klass, :type
end

class Pet < ActiveRecord::Base
  ...
  def klass
    self.type
  end
  def klass=(k)
    self.type = k
  end
end

どちらも機能しませんでした。助言がありますか?奇妙なことに、私のマシン (RVM 上の MRI 1.8.6) では正常に動作しますが、ステージング サーバー (RVM ではなく MRI 1.8.7) では失敗します。

4

3 に答える 3

1

ライアン・ベイツの「提案」(誰よりもレールについて詳しい) とあなたの実装の主な違いは、角かっこ ("self[:type] = ") を介した属性への直接アクセスを使用する提案と、それを使用する実装です。メソッド呼び出し ("self.type = ")

だから、次のようなものを試してください:

class Pet < ActiveRecord::Base
  ...
  def klass
    self[:type]
  end
  def klass=(k)
    self[:type] = k
  end
end
于 2010-06-15T00:25:48.600 に答える
0

絶対にこれを行う必要がある場合は、コントローラーで次の行に沿って何かを行います。

@pet = Pet.new(params[:pet])
@pet[:type] = params[:pet][:type]

IMO、これをやろうとするときは、明示的かつ苦痛を伴う方が良いでしょう.その場で型を変更するのは本当に悪い考えのように感じます.

于 2010-06-15T01:38:59.643 に答える
0

STI で使用される列名を .xml とは異なるものに変更することもできますtype

によるとrailsapi.com、サブクラスで設定できるため、petモデルに次を追加するだけです。

self.inheritance_column = "type_id"

あくまで推測ですので・・・全然違っててすみません。

于 2010-06-15T00:22:36.923 に答える