Ruby on Rails 4.2。
我有一个表单,下一个下拉列表取决于之前的选择。
以下工作(我们在rails控制器和js文件之间有一个映射):
(function(App, $, undefined) {
'use strict';
App.AdminReports = function() { # controller name
this.create = function(e) {
$('#quarter').css('display', 'none');
$('#kind_vo').change(function(){
if($('#kind_vo :selected').text() == 'Cele firm' || $('#kind_vo :selected').text() == 'Cele lokalizacji'){
$('#quarter').fadeIn('fast');
}
});
};
};
})(window.App = window.App || {}, jQuery);
但是,如果这个在字段中淡出没有通过rails验证(在我的情况下它是validates :quarter, presence: true
),它就会再次消失。有没有办法让这个领域更长久?我想这是因为重新加载后端验证页面失败了。
我该怎么办?
可能有一种简单的方法可以保持褪色的字段直到控制器发生变化或类似的事情。
答案 0 :(得分:1)
这就是我解决问题的方法:
.hidden {
display: none;
}
module FormRowHelper
# A thin wrapper around content_tag to produce an input row.
# @param [Symbol|String] tag_name
# @param [Hash] kwargs - hash of options passed to content_tag
# @option [Boolean] show - adds a hidden class if false
# @yield block to content_tag
# @return [String]
def input_row(tag_name = :div, show: true, **kwargs, &block)
classes = kwargs[:class].try(:split) || ['row']
classes << ['hidden'] unless show
options = kwargs.except(:class).merge(
class: classes.join(' ')
)
content_tag(tag_name, options) do
yield if block_given?
end
end
end
<%= form_for(@model) do |f| %>
<div class="row">
<%= f.select :a do %>
<%= options_for_select(
['Cele firm','Cele lokalizacji', 'Foo', 'Bar']
)
%>
<% end %>
</div>
<%= input_row(
show: ['Cele firm', 'Cele lokalizacji'].include?(@model.a),
id: 'kind_vo') do %>
<%= f.select :b do %>
<%= options_for_select([
['Lisbon', 1, { 'data-size' => '2.8 million' }],
['Madrid', 2, { 'data-size' => '3.2 million' }]
])
%>
<% end %>
<% end %>
<% end %>