Метод редактирования контроллера, изменение данных объекта перед фиксацией - PullRequest
2 голосов
/ 26 сентября 2010

Когда пользователь сохраняет форму, я хочу выполнить следующую проверку перед сохранением

if header2 is null
header2 = header1

Я не хочу добавлять проверку и останавливать действие сохранения, потому что header2 необходим только в редких случаях,Я не уверен, как заставить метод обновления в контроллере делать это.Команда для фиксации обновления:

if @entry.update_attributes(params[:entry])

Так что мне следует изменять поле params [: entry] [: header2]?Я попытался сделать это с помощью следующего кода, но он не обновляется

params[:entry][:header2] = params[:entry][:header1]

Любая помощь будет оценена.Я начинаю чувствовать, что должен обрабатывать это на стороне клиента с помощью javascript.

- РЕДАКТИРОВАТЬ: добавлено в исходное сообщение ниже -

Я попробовал приведенные ниже предложения кодерамы, и ни одна из них не работаетдля меня

  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 ]

2 голосов
/ 26 сентября 2010

Вот, пожалуйста, вместе со спецификациями, чтобы доказать

/ приложение / модели / 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
0 голосов
/ 26 сентября 2010

Обращаясь к вашим собственным опциям, это могут быть возможные решения, которые я успешно использовал в зависимости от моих обстоятельств.

Вариант 1 - Проверка модели

Создание пользовательскогопроверка или проверка на основе условия.Например,

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 - Изменить хэш в контроллере

Ваше второе предложение также будет работать.Например,

params[:entry][:header2] = params[:entry][:header1] unless params[:entry][:header2].present?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...