新手问题 如何使用动态方法 #{name}_controller? 方法代替 params [:controller] == "#{name}"

FlyingOnion · 2016年09月06日 · 最后由 small_fish__ 回复于 2016年09月07日 · 1477 次阅读

大家应该都用过 devise 这个 gem,里面应该有一个

before_action :configure_permitted_params, if: :devise_controller?

我现在想像上面那个 :devise_controller? 那样动态定义一个方法 whats_controller? 用来代替 params[:controller] == "whats" 好像用 define_method 行不通,因为要被 define 的那个函数名必须事先确定,而 controller 名是不确定的,比如 users_controller?,courses_controller? 是不是要用 method_missing?应该怎么写呢?

  1. 人家写 devise_controller 因为平常这些 controller 是隐藏在 gem 里的,你的 app/controllers/ 默认没有这些 controller
  2. 你写一个 before_action 然后 if: users_controller 为什么不直接在 users_controller 里写 before_action 呢?如果是多个 controller 共享一个 before_action 也不该是 if :users_controller? 写法。
  3. 如果你非要写,那就自己写个 method_missing 方法。这个留给你自己思考。

没看出来有什么意义,在 controller 里直接定义 before filter 不就好了

可以用 controller_nameaction_name 这两个 rails 方法呀,你要想学 devise 的风格自己封 helper 就是,你可以搜一下 devise 里源码这块的定义,看看是咋实现的

method_missing + define_method

需要 登录 后方可回复, 如果你还没有账号请 注册新账号