我现在还没有使用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_method
与action 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 文件夹执行某些操作,但我似乎无法找到有关如何使用它们的更新教程。
答案 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
。