【发布时间】:2011-02-11 17:11:01
【问题描述】:
我正在尝试在模型观察者中将消息分配给 flash[:notice]。
这个问题已经被问过了:Ruby on Rails: Observers and flash[:notice] messages?
但是,当我尝试在我的模型中访问它时收到以下错误消息:
#<0x2c1742c>0x2c1742c>
<
标签: ruby-on-rails activerecord rails-flash
我正在尝试在模型观察者中将消息分配给 flash[:notice]。
这个问题已经被问过了:Ruby on Rails: Observers and flash[:notice] messages?
但是,当我尝试在我的模型中访问它时收到以下错误消息:
#<0x2c1742c>0x2c1742c>
<
标签: ruby-on-rails activerecord rails-flash
我需要在模型中设置flash[:notice] 以覆盖通用的“@model 已成功更新”。
这是我做的
validation_message的虚拟属性
您可以在下面看到我的控制器和模型:
class Reservation < ActiveRecord::Base
belongs_to :retailer
belongs_to :sharedorder
accepts_nested_attributes_for :sharedorder
accepts_nested_attributes_for :retailer
attr_accessor :validation_code, :validation_messages
validate :first_reservation, :if => :new_record_and_unvalidated
def new_record_and_unvalidated
if !self.new_record? && !self.retailer.validated?
true
else
false
end
end
def first_reservation
if self.validation_code != "test" || self.validation_code.blank?
errors.add_to_base("Validation code was incorrect")
else
self.retailer.update_attribute(:validated, true)
self.validation_message = "Your validation is successful and you will not need to do that again"
end
end
end
class ReservationsController < ApplicationController
before_filter :authenticate_retailer!
after_filter :validation_messages, :except => :index
def validation_messages
return unless @reservation.validation_message.present?
flash[:notice] = @reservation.validation_message
end
end
一种可能的重构方法是将实际消息移动到适当的文件(例如语言环境)中,并仅将适当的键传递给validation_message。
如果您需要多个通知,将validation_message 转换为数组或散列并改名为validation_messages 很容易。
【讨论】:
if 条件简化为@reservation.flash_notice.present? 而不是“not blank?”
不,您在进行保存的控制器中设置它。 flash 是在 ActionController::Base 上定义的方法。
【讨论】:
validation_messages 然后在控制器 after_action 回调中检查它以根据 validation_messages 值设置闪存(在控制器内部)没有问题。