我在Rails中有一个表单,在提交时,使用参数重新加载相同的页面并显示一些数据。
我希望根据刚提交的内容检查或取消选中表单上的复选框。
这是我控制器中的内容 -
@show_values = false
if params[:check_value] == "1"
@show_values = true
end
然后在我看来,我有以下内容 -
<% if @show_breakfast%>
<div class="row"><%= check_box_tag 'check_value', 1, {:checked => "checked"}%> Show X</div>
<% else %>
<div class="row"><%= check_box_tag 'check_value', 1%> Show X</div>
<% end %>
这是我想要的方式,但我想知道是否有更聪明的方法来做到这一点。
答案 0 :(得分:0)
当您需要复杂的表单时,或者未附加到模型的表单时,可以使用“表单对象”。在'app'下创建一个名为forms或something的新文件夹。然后创建表单的shell:
在Rails 3中:
class SearchForm
include ActiveModel::Conversion
include ActiveModel::Validations
extend ActiveModel::Naming
def persisted?
false
end
end
在Rails 4中:
class SearchForm
include ActiveModel::Model
def persisted?
false
end
end
为您的字段添加一些attr_accessors:
class SearchForm
include ActiveModel::Model
attr_accessor :check_value, :title, :another_field
...
如果您愿意,可以添加验证器,通过包含和扩展ActiveModel来获得此行为:
...
validates :title, presence: true
然后是一个处理方法:
...
def process(params)
params = params[:search_form]
self.check_value = params[:check_value]
self.title = params[:title]
self.another_field = params[:another_field]
if valid?
#Do any processing you may need to do, including stuff like sanitising inputs.
return true
end
false
end
现在您可以像控制器中的模型一样使用它。
def search
@form = SearchForm.new
@form.process[params]
flash.now[:error] = "Invalid search input" unless @form.valid? # or whatever.
end
它的行为就像一个模型,因此您可以使用自己喜欢的表单构建器。
答案 1 :(得分:0)
我不确定我是否理解这个问题,但如果你想保持同样的方法,我只会在视图中看到这个:
<div class="row"><%= check_box_tag 'check_value', 1, @show_breakfast %> Show X</div>