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))

我阅读了一个使用别名的建议#type,因为 Ruby 认为保留字与#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),但在登台服务器上失败(MRI 1.8.7 不在 RVM 上)。

4

3 回答 3

1

ryan bates 的“建议”(谁比大多数人更了解 rails)与您的实现之间的主要区别在于建议使用通过括号直接访问属性(“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 一起使用的列名称更改为不同于type.

根据railsapi.com,它可以在子类中设置,因此只需在您的pet模型中添加以下内容:

self.inheritance_column = "type_id"

我只是在猜测......所以我很抱歉这是完全错误的。

于 2010-06-15T00:22:36.923 回答