简单形式 - 复选框
Simple form - checkboxes
我有模型搜索、颜色和颜色搜索:
def Search
has_many :colors, :through => :colors_searches
end
def Color
has_many :searches, :through => :colors_searhes
end
def ColorsSearch
belongs_to :color
belongs_to :search
end
在我看来,我想要多个颜色复选框,并且当用户提交表单时,将创建一个新的搜索记录,其中包含 colors_serches 条记录(每种颜色对应一条记录)。
<% Color.with_products.order(:name).each do |color| %>
<% if color.name != 'none' %>
<div class="checkbox">
<input type="checkbox" name="search[color_id]" value="<%= color.id %>" id="color-checkbox-<%= color.id %>">
<label for="color-checkbox-<%= color.id %>" style="background-color: <%= color.hex %>;"></label>
</div>
<% end %>
<% end %>
两个问题:
- 我如何重写上面的代码以使用简单的形式实现这一点?
- 控制器应该是什么样子的?
谢谢你的想法,
米罗斯拉夫
更新
下面的代码应该可以解决我正在寻找的大部分问题,唯一剩下的部分是:
- 隐藏标签(标签:false,似乎没有按预期工作)
根据颜色字段为每个生成的标签动态设置背景颜色。模型 Color 有一个属性 :hex,它存储颜色的十六进制标识,例如:#FFFFFF 表示白色等。
<%= s.association :colors, collection: Color.with_products.order(:name), label: false, as: :check_boxes %>
我需要类似于这段代码的东西,所以我会为每种颜色设置不同的背景颜色:
<%= s.association :colors, collection: Color.with_products.order(:name), label: false, as: :check_boxes, :label_html => { :style => "background-color: #{:hex};" } %>
解决方案
所以我找到了两个解决方案(可能不太优雅,但它们有效):
- 我能够找到如何为每个输入附加样式,如果您可以为输入呈现特定颜色,那么您可以轻松应用 jQuery 为表格复制该样式。
我的看法:
<%= s.association :colors, collection: Color.collection_for_filter, label: false, as: :check_boxes %>
颜色模型:
def self.collection_for_filter
array = []
Color.with_products.each { |c| array << ["#{c.id}", "#{c.id}", { :style => "background-color: #{c.hex}" }] }
array
end
我迭代所有颜色,并为每种颜色渲染一个输入和带有我需要的自定义值的标签。
" 名称="search[color_ids][]" id="search_color_ids_">
" 对于="search_color_ids_">
<% Color.with_products.each do |color| %>
<div class="checkbox">
<input class="check_boxes optional" type="checkbox" value="<%= color.id %>" name="search[color_ids][]" id="search_color_ids_<%= color.id %>">
<label class="collection_check_boxes" style="background-color: <%= color.hex %>" for="search_color_ids_<%= color.id %>">
</label>
</div>
<% end %>
我选择了选项 2,因为它似乎是更好的解决方案,无需使用 JavaScript。
下面的代码应该可以解决我正在寻找的大部分问题,唯一剩下的部分是:
- 隐藏标签(标签:false,似乎没有按预期工作)
- 根据颜色字段为每个生成的标签动态设置background-color。模型 Color 有一个属性 :hex,它存储颜色的十六进制标识,例如:#FFFFFF 表示白色等。
请参阅更新以获取代码参考。
我有模型搜索、颜色和颜色搜索:
def Search
has_many :colors, :through => :colors_searches
end
def Color
has_many :searches, :through => :colors_searhes
end
def ColorsSearch
belongs_to :color
belongs_to :search
end
在我看来,我想要多个颜色复选框,并且当用户提交表单时,将创建一个新的搜索记录,其中包含 colors_serches 条记录(每种颜色对应一条记录)。
<% Color.with_products.order(:name).each do |color| %>
<% if color.name != 'none' %>
<div class="checkbox">
<input type="checkbox" name="search[color_id]" value="<%= color.id %>" id="color-checkbox-<%= color.id %>">
<label for="color-checkbox-<%= color.id %>" style="background-color: <%= color.hex %>;"></label>
</div>
<% end %>
<% end %>
两个问题:
- 我如何重写上面的代码以使用简单的形式实现这一点?
- 控制器应该是什么样子的?
谢谢你的想法, 米罗斯拉夫
更新
下面的代码应该可以解决我正在寻找的大部分问题,唯一剩下的部分是:
- 隐藏标签(标签:false,似乎没有按预期工作)
根据颜色字段为每个生成的标签动态设置背景颜色。模型 Color 有一个属性 :hex,它存储颜色的十六进制标识,例如:#FFFFFF 表示白色等。
<%= s.association :colors, collection: Color.with_products.order(:name), label: false, as: :check_boxes %>
我需要类似于这段代码的东西,所以我会为每种颜色设置不同的背景颜色:
<%= s.association :colors, collection: Color.with_products.order(:name), label: false, as: :check_boxes, :label_html => { :style => "background-color: #{:hex};" } %>
解决方案
所以我找到了两个解决方案(可能不太优雅,但它们有效):
- 我能够找到如何为每个输入附加样式,如果您可以为输入呈现特定颜色,那么您可以轻松应用 jQuery 为表格复制该样式。
我的看法:
<%= s.association :colors, collection: Color.collection_for_filter, label: false, as: :check_boxes %>
颜色模型:
def self.collection_for_filter
array = []
Color.with_products.each { |c| array << ["#{c.id}", "#{c.id}", { :style => "background-color: #{c.hex}" }] }
array
end
我迭代所有颜色,并为每种颜色渲染一个输入和带有我需要的自定义值的标签。
<% Color.with_products.each do |color| %>
<div class="checkbox">
<input class="check_boxes optional" type="checkbox" value="<%= color.id %>" name="search[color_ids][]" id="search_color_ids_<%= color.id %>">
<label class="collection_check_boxes" style="background-color: <%= color.hex %>" for="search_color_ids_<%= color.id %>">
</label>
</div>
<% end %>
我选择了选项 2,因为它似乎是更好的解决方案,无需使用 JavaScript。
下面的代码应该可以解决我正在寻找的大部分问题,唯一剩下的部分是:
- 隐藏标签(标签:false,似乎没有按预期工作)
- 根据颜色字段为每个生成的标签动态设置background-color。模型 Color 有一个属性 :hex,它存储颜色的十六进制标识,例如:#FFFFFF 表示白色等。
请参阅更新以获取代码参考。