rails

时间:2015-12-31 19:32:08

标签: ruby-on-rails forms ruby-on-rails-4 activerecord

我有一个应用程序,人们可以提交网站上列出的各种优惠信息。

让我们说优惠A只要求您提交姓名,但优惠B需要第一个,最后一个和电话号码。

我已经提交了#39;具有所有这些字段的模型。在表单中呈现此内容的最佳方式是什么。

如果某人点击优惠A,他们应该会看到一个只有第一个和最后一个的表单。如果他们点击提议B,他们应该看到一个包含头号,姓氏和电话号码的表格。

显然,这是我想要完成的一个非常简单的例子。理想情况下,可能会有数百或数千个优惠和提交内容。表格需要根据所选择的要约而有所不同。

2 个答案:

答案 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中。