为所有成员路由设置之前的操作?

fot*_*nus 3 ruby-on-rails actioncontroller

使用Rails 4播放的时候,我注意到,它定义了一个before_action过滤器set_[model],即要求采取的行动show,edit,updatedestroy.

事实上它非常有用,但我认为没有对所有成员行动都没有多大意义.毕竟,如果您正在使用成员操作,您希望对该成员执行操作,因此您需要在某个时刻从数据库中恢复它.

请注意,通过成员操作,我还意味着routes.rbmembers块中配置的那些操作.

是否有直接的方法来做到这一点,没有列出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)

Rob*_*bin 7

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)