fot*_*nus 3 ruby-on-rails actioncontroller
使用Rails 4播放的时候,我注意到,它定义了一个before_action过滤器set_[model],即要求采取的行动show,edit,update和destroy.
事实上它非常有用,但我认为没有对所有成员行动都没有多大意义.毕竟,如果您正在使用成员操作,您希望对该成员执行操作,因此您需要在某个时刻从数据库中恢复它.
请注意,通过成员操作,我还意味着routes.rb在members块中配置的那些操作.
是否有直接的方法来做到这一点,没有列出before_action过滤器上的所有成员操作?
编辑:为了澄清,整点是使用一些rails魔法来获取所有成员路由并生成将在其中传递的数组:only.所以我可以做点什么
before_action set_model only: all_member_routes
Run Code Online (Sandbox Code Playgroud)
其中all_member_routes一段代码返回我的模型的所有成员路由.
甚至更好,
before_action set_model, only_member_actions: true
Run Code Online (Sandbox Code Playgroud)
的show,edit,update,destroy行动正是所有成员的行动.他们是唯一需要找到模型的人.
如果您有自己的成员操作,那么您必须自己将其添加到列表中.
before_action :set_item, only: [:edit, ..., :my_member_action]
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用该:except选项排除不需要它的所有集合操作:
before_action :set_item, except: [:index, :create]
Run Code Online (Sandbox Code Playgroud)
这样,如果添加其他成员操作,则无需进行任何更改.就个人而言,我更喜欢明确和使用:only.
我很确定没有更简单的方法,你无法自动检测所有成员操作.
编辑:
我真的不认为你应该那样做但是......
您可以使用该controller_name方法访问控制器的名称.
获取与控制器相关的路由:
routes = Rails.application.routes.routes.select { |r| r.defaults[:controller] == controller_name }
Run Code Online (Sandbox Code Playgroud)
然后,我认为查看路由是否为成员路由的最佳方法是@parts数组包含:id.也许你可以找到一种更健壮的方式.
所以我会这样做:
routes.select { |r| r.parts.include?(:id) }.map { |r| r.defaults[:action] }.map &:to_sym
Run Code Online (Sandbox Code Playgroud)
那会给你:[:show, :preview, :my_challenges]for
resources :users, only: [:index, :show], controller: 'accounts/users' do
member do
get :preview
get :my_challenges
end
end
Run Code Online (Sandbox Code Playgroud)
class ApplicationController < ActionController::Base
def member_routes
Rails.application.routes.routes
.select { |r| r.defaults[:controller] == controller_name && r.parts.include?(:id) }
.map { |r| r.defaults[:action] }
.map(&:to_sym)
end
end
class UsersController < ApplicationController
before_action set_model, only: member_routes
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7962 次 |
| 最近记录: |