2012-04-05 58 views
1

我有一种情况,用户能够研究某些技术并获得一些奖励。现在,这些奖励有点像能够创造一些物品,获得生产提升等等。在过滤器内处理Flash消息的正确方法

我目前正在做的是处理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消息,它几乎超出了范围。

因此,我想问一下,如何从最佳实践的角度出发,让代码尽可能干,尽可能书写。

+0

请让我知道,如果我明白你的问题是错误的 - 显示Flash消息通常是在您可能使用的布局文件之一。这样它就处于所有观点的中心位置。你在控制器中所拥有的是正确的。没有必要使用before_filter。请让我知道,如果你需要一个例子,我可以发布一个。希望有所帮助。 – Prashanth 2012-04-05 11:15:49

回答

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 
+0

正是那个tsherif。我实际上需要current_user和验证无法提供的更多数据,更正。我很高兴你也认为控制器对你来说似乎也是正确的方式。我实际上使用单个衬垫,因为我在我的控制器中进行了多次检查,并且我并不想在一个操作中有太多的线。 – Spyros 2012-04-05 17:36:08

相关问题