当用户保存表单时,我想在保存之前进行以下检查
if header2 is null
header2 = header1
我不想添加验证并停止保存操作,因为只在极少数情况下才需要header2。 我不确定如何让控制器中的更新方法执行此操作。提交更新的命令是
if @entry.update_attributes(params[:entry])
我应该修改params [:entry] [:header2]字段吗?我尝试使用以下代码执行此操作,但它没有更新
params[:entry][:header2] = params[:entry][:header1]
任何帮助将不胜感激。我开始觉得我应该在客户端使用javascript来处理这个问题。
- 编辑:添加到原始帖子下面 -
我在下面尝试过coderama的建议,但对我来说都不起作用
validate :data_present
def data_present
self.header2 = self.header1 if self.header2 == nil
end
和
def update
@entry = Entry.find(params[:id])
params[:entry][:header2] = params[:entry][:header1] unless params[:entry][:header2].present?
respond_to do |format|
if @entry.update_attributes(params[:entry])....
SQL
mysql> select header1, header2 from entries where title = "new";
+---------+---------+
| header1 | header2 |
+---------+---------+
| Blah | NULL |
+---------+---------+
1 row in set (0.00 sec)
我希望能够在编辑模式下打开,不做任何更改(字段已经为空)并点击保存并更改此代码。还尝试制作新的记录,但它也不起作用。
答案 0 :(得分:2)
在这里,您需要提供证明的规格
<强> /app/models/model_name.rb 强>
class ModelName < ActiveRecord::Base
attr_accessor :header_1, :header_2
before_validation :header_check
def header_check
return if self.header_2.blank?
self.header_1 = self.header_2 if self.header_1.blank?
end
end
并且规范:/spec/models/model_name_spec.rb
require 'spec_helper'
describe ModelName do
before(:each) do
@model_name = ModelName.new
@header_one_text = "HeaderOneText"
@header_two_text = "HeaderTwoText"
end
it "should should set header 2 if header 1 is blank" do
@model_name.header_2 = @header_two_text
@model_name.valid?
@model_name.header_1.should == @header_two_text
end
it "should leave header 1 if both are set" do
@model_name.header_1 = @header_one_text
@model_name.header_2 = @header_two_text
@model_name.valid?
@model_name.header_1.should == @header_one_text
end
end
答案 1 :(得分:0)
解决您自己的选择,这些可能是我已成功使用的解决方案,具体取决于我的具体情况。
选项1 - 模型验证
根据条件创建自定义验证或验证。 E.g。
class Body < ActiveRecord::Base
validates_presence_of :hair, :unless => lambda { |o| o.age > 80 }
validate :multiple_heads
def multiple_heads
self.head = "No head" if self.head == nil
end
end
选项2 - 修改控制器中的哈希
你的第二个建议也会奏效。 E.g。
params[:entry][:header2] = params[:entry][:header1] unless params[:entry][:header2].present?