在过滤器中处理Flash消息的正确方法

时间:2012-04-05 09:57:34

标签: ruby-on-rails ruby-on-rails-3

我遇到的情况是用户能够研究某些技术并获得一些奖励。现在,这些奖励有点像能够创造一些物品,获得生产提升等等。

我目前正在做的是处理我的控制器中的Flash消息和重定向。因此,想象一下,为了创建项目,您必须研究特定技术。我的控制器就像:

def create

    flash[:error] = I18n.t('error.not_researched') and redirect_to research_url and return if not current_user.has_research?(research)
    ....
    ....
end 

嗯,当然这很好用,但我不确定这是做事的最佳方式。我想过可能会使用before_create过滤器来做到这一点,但是这样,我无法真正设置flash消息,它几乎超出了范围。

因此,我想问一下如何根据最佳实践进行处理,以便代码尽可能干净并且编写得很好。

1 个答案:

答案 0 :(得分:1)

实际上,问题不在于设置Flash消息。您可以通过在模型中进行验证,然后检查它是否保存在控制器中来完成此操作。

unless research.save
  flash[:error] = I18n.t('error.not_researched')
  redirect_to research_url
  return
end

您的案例中的问题是您需要访问current_user,这表明控制器是进行此项检查的正确位置。

关于风格的旁注:如果您将支票拆分为多行,我认为您的代码会更清晰。

unless current_user.has_research?(research)
  flash[:error] = I18n.t('error.not_researched')
  redirect_to research_url
  return
end