Ruby on Rails Polymorphic - 控制器和View解决方案

时间:2015-07-24 23:13:01

标签: ruby-on-rails ruby nested-forms polymorphic-associations

我一直试图将我的想法包含在我的应用程序的多态结构中一段时间​​,但我无法得到它,而且我不知道如何解决它。

我有供应商模型,供应商的个人资料可以由公司或下面列出的人员。

供应商模式

class Supplier < ActiveRecord::Base
    belongs_to :profile, :polymorphic => true
    accepts_nested_attributes_for :personable, :allow_destroy => true, :reject_if => :all_blank
end

公司模式

class Company < ActiveRecord::Base
    has_one :supplier, as: :profile
end

人物模型

class Person < ActiveRecord::Base
    has_one :supplier, as: :profile
end

在模型级别(在控制台上)我的关联工作正常,但我必须预先在两个模型之间(例如supplier.profile = Company.new)。

我想要的是,当用户进入新供应商行动时,如果供应商是个人或公司,他可以在表格上选择,然后必须采取措施来显示正确的字段。然后回到Create动作,处理一切。

我已阅读很多stackoverflow问题,并观看Ryan Bates演员#197和#394。

我是一个热心的Rails,而不是程序员。

如果有人能指出我正确的方向,我会很感激。

此致 大卫

1 个答案:

答案 0 :(得分:2)

这在很大程度上取决于您需要的各种字段以及共享的数据量。但如果它们非常不同,我实际上会在页面上有两个单独的div或部分,一个单选按钮切换显示一个&amp;用javascript隐藏另一个。如果它在视图的底部是jquery,可以很容易地做到这一点,因为它是rails中的默认值:

 <input type="radio" name="supplier_type" value="person" />
 <input type="radio" name="supplier_type" value="company" />

 <script>
   $('input[name="supplier_type"]').on('change', function () {
      if ($(this).val() === "person") {
        $('.person-form').show();
        $('.company-form').hide();
      }
      else {
        $('.person-form').hide();
        $('.company-form').show();
      }
   });
 </script>

然后在每个div中都有一个完全独立的形式,发布到不同的动作。如果数据不同,需要两种形式,那么为此需要两个不同的控制器。

现在,如果它只是几个不同的字段,或者是一个或多个字段的附加字段。我会在form_for中使用与上面相同的单选按钮。再次附加一些javascript来显示或隐藏值。在控制器中,使用单选按钮值进行检查以获得所需的参数:

 supplier_params = params.slice :list, :of, :generic, :params

 if params[:supplier_type] == "company"
   supplier_params.merge! params.slice :company_name
 elsif params[:supplier_type] == "person"
   supplier_params.merge! params.slice :person_name
 end

 Supplier.new supplier_params