Ruby on rails 不确定我是否在Rails中正确使用before\u filter/before\u action

Ruby on rails 不确定我是否在Rails中正确使用before\u filter/before\u action,ruby-on-rails,ruby,Ruby On Rails,Ruby,我已经有一段时间没有使用Rails了,但我知道Rails附带了如下功能 应用程序\u控制器.rb before_filter :login_with_access_token helper_method :current_user 据我所知,before\u filter将在控制器中的每个操作之前运行aftersaid方法。考虑到这是应用程序控制器,它将在每次操作之前运行它,因为一切都继承自应用程序控制器。我猜helper\u方法是我们经常检查的方法,可以在视图中访问 我想我有点困惑的原因是

我已经有一段时间没有使用Rails了,但我知道Rails附带了如下功能

应用程序\u控制器.rb

before_filter :login_with_access_token

helper_method :current_user
据我所知,
before\u filter
将在控制器中的每个操作之前运行aftersaid方法。考虑到这是应用程序控制器,它将在每次操作之前运行它,因为一切都继承自应用程序控制器。我猜
helper\u方法是我们经常检查的方法,可以在视图中访问

我想我有点困惑的原因是我不完全明白为什么我们需要
helper\u方法
,除了您希望在视图中使用它们之外。例如,如果我只想检查一个
模特是否是成年人。。。什么能说服人们选择一种
helper\u方法
而不是
行动方法
?前

def is_adult?
  person.age > 18
end
这就是我在具体问题中感到困惑的地方。 只有选择了
食品
对象,才能查看某些页面。意思是,我的路线:

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

我接着在过滤器之前添加了一个
:用户\u有\u食物

  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
但是。。。现在的问题是。。。我有一个很厚的控制器。。。有很多行动。。。如果它点击另一个动作,它就会失败,并且会尝试重定向我,因为
用户\u has\u food
结果为false。看看这个。。。这似乎不对。正确解决这个问题的理想和最佳解决方案是什么


我想对/app/helpers文件夹做些什么,但我似乎找不到关于如何使用它们的更新教程

您只能对某些特定控制器的
操作调用
before\u filter
,如下所示

before_filter :user_has_food, only: [:display_user_food]
rails 5.0
中,before\u filter
已被弃用,您应该使用
before\u action
。如果只有一个操作需要过滤,可以避免使用数组,请参阅下面的代码段

before_filter :user_has_food, only: :display_user_food

当您在
before\u filter
中使用
only
选项时,当请求用于其他操作时,它将忽略调用。

您可以仅为某些特定控制器
操作调用
before\u filter
,如下所示

before_filter :user_has_food, only: [:display_user_food]
rails 5.0
中,before\u filter
已被弃用,您应该使用
before\u action
。如果只有一个操作需要过滤,可以避免使用数组,请参阅下面的代码段

before_filter :user_has_food, only: :display_user_food

当您在过滤器之前使用
中的
选项时,当其他操作的请求到来时,它将忽略调用。

在任何视图和控制器中都可以访问Helper方法,但操作方法绑定到该特定类的对象。所以像
current\u user
这样不需要任何对象的东西应该是一个helper方法。 Rokibul正确地指出只使用
语法:[]
来避免其他控制器操作。
但请注意,Rails 5.0中不推荐使用所有before_过滤器语法,并将在Rails 5.1中删除,请改用
before_action

Helper方法可在任何视图和控制器中访问,但action方法绑定到该特定类的对象。所以像
current\u user
这样不需要任何对象的东西应该是一个helper方法。 Rokibul正确地指出只使用
语法:[]
来避免其他控制器操作。
但请注意,Rails 5.0中不推荐使用所有before_过滤器语法,并将在Rails 5.1中删除,请改用
before_action

好的,这就解决了它。最终,如果你要这样做,你会像我一样处理问题,还是会使用类似于
helper\u method
的方法?我不会使用helper方法,因为helper方法是你经常使用的视图和控制器。我会使用前文件管理器。如果真的对你有帮助的话,你可以让这个答案正确:)好的,这就解决了它。最终,如果你要这样做,你会像我一样处理问题,还是会使用类似于
helper\u method
的方法?我不会使用helper方法,因为helper方法是你经常使用的视图和控制器。我会使用前文件管理器。如果真的对您有帮助,您可以正确回答:)