Ruby 关于 Rails 多态 - 控制器和视图解决方案
Ruby on Rails Polymorphic - Controller and View solution
一段时间以来,我一直在尝试为我的应用程序考虑多态结构,但我无法理解,而且我不知道如何解决它。
我有一个供应商模型,供应商的资料可以由公司或个人提供,如下所列。
供应商模型
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
)。
我想要的是,当用户进入 NEW Supplier 操作时,如果供应商是个人或公司,他可以在表单上 select,然后必须做一些事情来显示正确的字段为了。然后回到创建操作,处理所有事情。
我阅读了很多 Whosebug 问题并观看了 Ryan Bates 的 #197 和 #394。
我是一个Rails热心人,不是程序员。
如果有人能指出我正确的方向,我将不胜感激。
此致,
大卫
这在很大程度上取决于您需要的领域的多样性,以及共享的数据量。但如果它们非常不同,我实际上会在页面上有两个单独的 div 或部分,单选按钮切换显示一个并使用 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 中都有一个完全独立的形式,post 用于不同的操作。如果数据不同到需要两种形式,那么为此有两个不同的控制器是值得的。
现在,如果它只是几个不同的字段,或者一个或其他的额外字段。我会在 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
一段时间以来,我一直在尝试为我的应用程序考虑多态结构,但我无法理解,而且我不知道如何解决它。
我有一个供应商模型,供应商的资料可以由公司或个人提供,如下所列。
供应商模型
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
)。
我想要的是,当用户进入 NEW Supplier 操作时,如果供应商是个人或公司,他可以在表单上 select,然后必须做一些事情来显示正确的字段为了。然后回到创建操作,处理所有事情。
我阅读了很多 Whosebug 问题并观看了 Ryan Bates 的 #197 和 #394。
我是一个Rails热心人,不是程序员。
如果有人能指出我正确的方向,我将不胜感激。
此致, 大卫
这在很大程度上取决于您需要的领域的多样性,以及共享的数据量。但如果它们非常不同,我实际上会在页面上有两个单独的 div 或部分,单选按钮切换显示一个并使用 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 中都有一个完全独立的形式,post 用于不同的操作。如果数据不同到需要两种形式,那么为此有两个不同的控制器是值得的。
现在,如果它只是几个不同的字段,或者一个或其他的额外字段。我会在 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