不确定我是否在Rails中正确使用before_filter / before_action

时间:2017-04-26 16:35:45

标签: ruby-on-rails ruby

我现在还没有使用Rails,但我知道Rails带有像

这样的东西

application_controller.rb

before_filter :login_with_access_token

helper_method :current_user

根据我的理解,before_filter将在此控制器中的每个操作之前运行aftersaid方法。考虑到这是 ApplicationController ,它将在每个操作之前运行它,因为所有内容都继承自 ApplicationController 。我想helper_method是一种经常检查的方法,可以在我们的视图中访问。

我想我有点困惑的原因是我不完全明白为什么我们需要helper_methods除了您希望在视图中使用它们之外的事实。例如,如果我只想检查一个person模型是否是成年人...会说服一个人选择helper_methodaction method?实施例

def is_adult?
  person.age > 18
end

现在这是我在特定问题上感到困惑的地方。 如果您选择了Food对象,则只能查看某些页面。意思,我的路线:

get '/user/:user_id/food/:food_id', to: 'units#display_user_food', as: 'display_user_food'

我继续添加before_filter :user_has_food

  def user_has_food
    unless UserFood.where(id: params["user_id"]).empty?
      true
    else
      unit_id = params["unit_id"]
      false
      puts "------------ User does not have food :("
      redirect_to "/user/new-food/#{unit_id}"
    end
  end

但是......现在的问题是......我有一个非常厚的控制器...有很多动作......如果它遇到另一个动作,它就会失败,并会尝试重定向我{{{ 1}}结果是假的。看着这......这似乎不对。 正确解决此问题的理想和最佳解决方案是什么?

我想对 / app / helpers 文件夹执行某些操作,但我似乎无法找到有关如何使用它们的更新教程。

2 个答案:

答案 0 :(得分:2)

您只能为某些特定控制器before_filter拨打action,如下所示

before_filter :user_has_food, only: [:display_user_food]

不推荐rails 5.0 before_filter,您应该使用before_action。如果您只有一个要过滤的操作,则可以避免使用数组,请参阅下面的代码段

before_filter :user_has_food, only: :display_user_food

当您在only中使用before_filter选项时,如果请求执行其他操作,则会忽略调用。

答案 1 :(得分:1)

Helper方法可在任何视图和控制器中访问,但操作方法绑定到该特定类的对象。所以像current_user这样不需要任何对象的东西应该是一个辅助方法。 Rokibul正确地指出了使用only: []语法来避免其他控制器操作。 但请注意,Rails 5.0中不推荐使用所有before_filters语法,并且将在Rails 5.1中删除,而是使用before_action