【问题标题】:Accessing rails flash[:notice] in a model在模型中访问 rails flash[:notice]
【发布时间】:2011-02-11 17:11:01
【问题描述】:

我正在尝试在模型观察者中将消息分配给 flash[:notice]。

这个问题已经被问过了:Ruby on Rails: Observers and flash[:notice] messages?

但是,当我尝试在我的模型中访问它时收到以下错误消息:

#<0x2c1742c>

&lt;

标签: ruby-on-rails activerecord rails-flash


【解决方案1】:

我需要在模型中设置flash[:notice] 以覆盖通用的“@model 已成功更新”。

这是我做的

  1. 在各自的模型中创建了一个名为validation_message的虚拟属性
  2. 然后我在需要的时候在各自的模型中设置虚拟属性
  3. 当此虚拟属性不为空时使用 after_action 覆盖默认闪存

您可以在下面看到我的控制器和模型:

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?
【解决方案2】:

不,您在进行保存的控制器中设置它。 flash 是在 ActionController::Base 上定义的方法。

【讨论】:

  • Ryan 是对的。您应该在控制器中设置闪光灯......这是视图表示层的功能。上面的“答案”是很多危险的繁重工作才能使其正常工作。
  • 正如我在帖子中所说,在我的应用程序中设置控制器中的闪存是不切实际的(如果可能的话)。每次更新模型时,我都需要向闪存添加一条消息;我不知道这样做的另一种方法 - 至少不会在墙上扔一盘意大利面条代码。
  • 我今天也简短地与这个问题搏斗,但在解决了我自己的困境之后,我看到你已经在我上面的评论中回答了你的问题。 “每次更新模型时,我都需要在闪存中添加一条消息。”我知道您说这不切实际,但我将闪存放在控制器的更新方法中。 (正在捕获异常,然后闪烁错误。)
  • 有时候世界并不像你想的那么简单。我需要设置从猴子补丁扩展到 Sunspot/RSolr 的 flash,它是在请求周期期间从不同线程上的模型回调触发的。请不要回答显而易见的问题。您当然可以提到它通常以一种方式完成,但除非它直接回答问题,否则它根本没有帮助。
  • 我认为定义一个模型 attr_accessor 像 validation_messages 然后在控制器 after_action 回调中检查它以根据 validation_messages 值设置闪存(在控制器内部)没有问题。
猜你喜欢
  • 2011-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-26
相关资源
最近更新 更多