如何验证取决于复选框的输入

时间:2018-05-08 11:09:56

标签: ruby-on-rails

我最近开始使用rails。 我在这里有一项任务,但我不知道什么是最佳做法以及如何做。

我的表单包含复选框currency?和输入currency_code。 只有值currency_code将存储在数据库中。

我需要什么: 1.如果复选框currency?为TRUE =>必须填写currency_code 2.如果复选框currency?为FALSE => currency_code将重置为nil

如何验证1.如果currency?不在数据库(表列)中,那么模型不知道这个? 在案例2.我应该检查这个并将值currency_code重置为nil?

对于案例2.我在控制器中有这个,但我不喜欢。我认为必须有更好的解决方案。

def data_params
  parameters = params.require(:data).permit(
    :currency_code
  )
  parameters[:currency_code] = nil unless params[:data][:currency].to_bool
  parameters
end

2 个答案:

答案 0 :(得分:1)

属性'货币?'不属于模型的部分称为虚拟属性。在Rails中,我们可以通过设置

来使用虚拟属性
attr_accessor :currency?
<_> in_aldate_model.rb。

现在您可以使用这种货币?&#39;表单中的属性与其他模型属性一样。

对于案例2,此类数据验证的要点是在进入模型之前在视图中验证它们。你必须使用jquery / javascript或任何你选择的脚本。在这里,我提供了jQuery代码段。

如果您是在rails app中使用jquery的新手,请按照此https://github.com/rails/jquery-rails

进行操作

在您的form_page.html.erb中添加ids到html元素。

<%= f.check_box :currency?, id: 'currency_checkbox' %>

<%= f.text_field :currency_code, id: 'currency_code' %>

jquery片段

curreny_checkbox = $('#curreny_checkbox')
currency_code = $('#currency_code')

$(currency_checkbox).on('change', function(){
   if(this.checked)
      currency_code.val('2')
   else
      currency_code.val('')
 })  

在您的控制器中,您只需指定值

即可
 def create
  // other codes //
   @obj.currency_code = params[:currency_code]
 end

答案 1 :(得分:0)

如果要验证模型级别的输入,您应该存储货币吗?在数据库中。

仍然可以说,由于某些无法解释的原因,您不想存储货币?在你的数据库中(我赢了,无论如何)。您可以在模型中定义方法。

def set_currency_if_required is_currency_required
   self.currency_code = nil unless is_currency_required
end
控制器中的

def create
  model = Model.new(data_params)
  model.set_currency_if_required(params[:data][:currency].to_bool)
  model.save
end
...
def data_params
  parameters = params.require(:data).permit(
    :currency_code
  )
end

通过这种方式,您将获得更好的可读性,并清楚了解代码的最新进展。