我为一个类生成了脚手架:ExpenseReport
其中一个属性是type
- 我创建了一个selct,其中有两个选项:Major
和Regular
。
提交表单以创建报告时,我提出了这个错误:
Invalid single-table inheritance type: Regular is not a subclass of ExpenseReport
我的假设是 - “好吧,我们只是没有一个名为type的属性,看起来这可能会导致问题。”所以我创建了一个迁移,重命名类型为“报告类型”并进行了raked(请参阅下面的迁移和rake证明)
移植
class UpdaeColumnName < ActiveRecord::Migration
def change
rename_column :expense_reports, :type, :report_type
end
end
耙子证明
Drews-MacBook-Pro:depot drewwyatt$ rails generate migration UpdaeColumnName
invoke active_record
create db/migrate/20130820215925_updae_column_name.rb
Drews-MacBook-Pro:depot drewwyatt$ rake db:migrate
== UpdaeColumnName: migrating ================================================
-- rename_column(:expense_reports, :type, :report_type)
-> 0.0021s
== UpdaeColumnName: migrated (0.0021s) =======================================
然而,现在,它从来没有保存我的输入,并且每次提交都会激活验证 - 告诉我“报告类型不包含在列表中”,是否有我需要更新的其他属性名称或者什么?
相关_form.html.erb
<div class="field">
<%= f.label :report_type %><br>
<%= f.select :report_type, ExpenseReport::TYPES,
prompt: "select one" %>
</div>
模型
class ExpenseReport < ActiveRecord::Base
validates :place_of_purchase, :items, :reason, :estimated_cost,
:requestor_name, presence: true
TYPES = [ 'Major', 'Regular' ]
validates :report_type, inclusion: TYPES
SITES = [ '001 (Lubbock)', '002 (Odessa)', '003 (Midland)', '004 (Lubbock)' ]
validates :site, inclusion: SITES
end
答案 0 :(得分:1)
属性“type”用于单表继承,可在此处找到更多信息:http://railscasts.com/episodes/394-sti-and-polymorphic-associations或此处:http://rails-bestpractices.com/posts/45-use-sti-and-polymorphic-model-for-multiple-uploads
如果您使用新的report_type,则应更改脚手架的内容。你是铁轨4吗?如果是,请在expense_reports_controller.rb中更改您的私人expense_report_params方法
应该是这样的:
def expense_report_params
params.require(:expense_report).permit(:place_of_purchase, :items, :reason, :estimated_cost, :requestor_name, :other_attributes, :type)
end
将其更改为:
def expense_report_params
params.require(:expense_report).permit(:place_of_purchase, :items, :reason, :estimated_cost, :requestor_name, :other_attributes, :report_type)
end
在导轨4中,你总是必须允许你的参数。否则它将不起作用。如果你允许一个不存在的参数“type”,你就会收到错误..