我是否需要更新rails中的属性? (如何?)

时间:2013-08-20 22:19:32

标签: ruby-on-rails

我为一个类生成了脚手架:ExpenseReport 其中一个属性是type - 我创建了一个selct,其中有两个选项:MajorRegular

提交表单以创建报告时,我提出了这个错误:

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

1 个答案:

答案 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”,你就会收到错误..