Rails - 获取复选框值并根据参数设置检查状态的最佳方法

时间:2014-08-13 21:23:25

标签: ruby-on-rails checkbox

我在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 %>

这是我想要的方式,但我想知道是否有更聪明的方法来做到这一点。

2 个答案:

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