首页 > 解决方案 > 如何验证取决于复选框的输入

问题描述

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

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

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

如何验证 1. 如果currency?不在数据库中(表列)所以模型不知道这个?在情况 2. 我应该在哪里检查并将值重置currency_code为零?

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

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

标签: ruby-on-rails

解决方案


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

attr_accessor :currency?

在您对应的_model.rb 中。

现在您可以使用这种“货币”了吗?表单中的属性与其他模型属性一样。

对于案例 2,这种数据验证的设置是在进入模型之前在视图中验证它们。您必须使用 jquery / javascript 或您选择的任何脚本。在这里,我提供了 jQuery 片段。

如果您是在 Rails 应用程序中使用 jquery 的新手,请遵循此https://github.com/rails/jquery-rails

在您的 form_page.html.erb 中为 html 元素添加 id。

<%= 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

推荐阅读