10

buyer.save失敗するかどうかを確認するには、次を使用しbuyer.valid?ます。

def create
  @buyer = Buyer.new(params[:buyer])
  if @buyer.valid?
    my_update_database_method
    @buyer.save
  else
    ...
  end
end

update_attributes失敗するかどうかを確認するにはどうすればよいですか?

def update 
  @buyer = Buyer.find(params[:id])
  if <what should be here?>
    my_update_database_method
    @buyer.update_attributes(params[:buyer])
  else
    ...
  end
end
4

5 に答える 5

14

実行されなかった場合はfalseを返します。これは、と同じsaveです。save!あなたがそれをもっと好きなら例外を投げます。あるかどうかはわかりませんがupdate_attributes!、論理的です。

ただやる

if @foo.update_attributes(params)
  # life is good
else
  # something is wrong
end

http://apidock.com/rails/ActiveRecord/Base/update_attributes

編集

次に、このメソッドを作成する必要があります。paramssanitationを事前に確認したい場合。

def params_are_sanitary?
  # return true if and only if all our checks are met
  # else return false
end

編集2

または、制約に応じて

if Foo.new(params).valid? # Only works on Creates, not Updates
  @foo.update_attributes(params)
else
  # it won't be valid.
end
于 2011-01-17T13:19:25.487 に答える
1

update_attributesオブジェクトが無効な場合、メソッドはfalseを返します。したがって、この構造を使用するだけです

def update
  if @buyer.update_attributes(param[:buyer])
    my_update_database_method
  else
    ...
  end
end

my_update_database_methodの前にのみ呼び出す必要がある場合update_attributesは、マージ方法を使用する必要があります。おそらく次のようになります。

def update
  @buyer = Buyer.find(params[:id])
  @buyer.merge(params[:buyer])
  if @buyer.valid?
    my_update_database_method
    @buyer.save
  else
    ...
  end
end
于 2011-01-17T14:06:46.817 に答える
1

これは最善の答えではないかもしれませんが、あなたの質問に答えているようです。

def self.validate_before_update(buyer)#parameters AKA Buyer.validate_before_update(params[:buyer])
# creates temporary buyer which will be filled with parameters
# the temporary buyer is then check to see if valid, if valid returns fail.
      temp_buyer = Buyer.new
# populate temporary buyer object with data from parameters
      temp_buyer.name = buyer["name"]
# fill other required parameters with valid data
      temp_buyer.description = "filler desc"
      temp_buyer.id = 999999 
# if the temp_buyer is not valid with the provided parameters, validation fails
    if  temp_buyer.valid? == false
        temp_buyer.errors.full_messages.each do |msg|
          logger.info msg
        end        
# Return false or temp_buyer.errors depending on your need.
        return false
    end

return true

終わり

于 2011-08-27T03:40:56.630 に答える
1

before_saveを使用してモデルで確認することをお勧めします

before_save :ensure_is_valid
private 
def ensure_is_valid
  if self.valid?
  else
  end
end
于 2012-11-20T02:16:05.447 に答える
0

私は同じシナリオに遭遇しました-レコードが有効かどうかを知り、更新を保存する前にいくつかのアクションを実行する必要があります。以前にメソッドが使用するassign_attributes(attributes)メソッドがあることを知りました。したがって、今日では、次のことを行うのが正しい可能性があります。updatesave

def update
  @buyer = Buyer.find(params[:id])
  @buyer.assign_attributes(params[:buyer])
  if @buyer.valid?
    my_update_database_method
    @buyer.save
  else
    ...
  end
end
于 2020-08-20T10:17:17.887 に答える