我有一个应用程序,人们可以提交网站上列出的各种优惠信息。
让我们说优惠A只要求您提交姓名,但优惠B需要第一个,最后一个和电话号码。
我已经提交了#39;具有所有这些字段的模型。在表单中呈现此内容的最佳方式是什么。
如果某人点击优惠A,他们应该会看到一个只有第一个和最后一个的表单。如果他们点击提议B,他们应该看到一个包含头号,姓氏和电话号码的表格。
显然,这是我想要完成的一个非常简单的例子。理想情况下,可能会有数百或数千个优惠和提交内容。表格需要根据所选择的要约而有所不同。
答案 0 :(得分:3)
每个商品需要有一组标签,表明必填字段。
这可以很容易地存储为表示简单的json数组[:name,:phone_number,....]等的序列化字符串。
在视图中包含此字段,并且只显示在required_fields数组中的字段。
如果您想在不重新加载页面的情况下动态更改商品,那么您将发送所有字段,但在更改商品时使用jQuery隐藏不需要的字段。
如果您确实需要无页面更新类型解决方案,我强烈建议您调查react.rb(http://reactrb.org),但如果您希望在商品更改时刷新页面,那么只需执行此操作即可视图逻辑。
以下是一些粗略的代码大纲:
class Offer < ActiveRecord::Base
serialize :required_fields # will be an array of tags - there are also nice gems for this too
end
# in your view file
# assume a variable field is in a loop generating each field then:
<% if @offer.required_fields.include? field %>
<!-- generate the field -->
<% end %>
答案 1 :(得分:1)
要添加到Mitch
的建议,您必须知道每个模型都会包含attributes
method,这样您就可以遍历Model
的属性:
@offer.attributes.each do |field|
# if field is required
end
你可以做的是将其与Mitch
的答案混合使用,但是,你需要在表格中创建一个名为required
的单独属性。这应该等同于散列,并允许您存储为每条记录建议的Mitch
:
#app/views/offer/show.html.erb
<%= form_for @offer do |f| %>
<% @offer.attributes.each do |field| %>
<% f.text_field field.to_sym if @offer.required.includes?(field) %>
<% end %>
<%= f.submit %>
<% end %>
您可以将required
字段存储为某种key:value
对;值得注意的是hstore
中的PGSQL
字段类型,或只是longtext
将其存储在MYSQL
中。