控制器编辑方法,在提交之前修改对象数据

时间:2010-09-26 13:53:01

标签: ruby-on-rails ruby

当用户保存表单时,我想在保存之前进行以下检查

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)

我希望能够在编辑模式下打开,不做任何更改(字段已经为空)并点击保存并更改此代码。还尝试制作新的记录,但它也不起作用。

2 个答案:

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