我最近开始使用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
答案 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
通过这种方式,您将获得更好的可读性,并清楚了解代码的最新进展。