2014-02-10 3 views
2

, 나는 그는 행동 show, edit, updatedestroy 호출됩니다, 그것은 before_action 필터 set_[model]을 정의하는 것으로 나타났습니다.조치를 모든 회원 경로에 설정 하시겠습니까? 레일 4 주위 재생

사실 매우 유용하지만 모든 회원의 행동에 영향을주지는 않습니다. 어쨌든 당신이 일원 활동을 사용하고있는 경우에, 당신은 저 일원에 행동하고 싶다, 그러므로 당신은 어느 시점에서 데이타베이스에서 그것을 회복 할 필요가있다.

구성원 작업에 따라 members 블록의 routes.rb에 구성된 멤버도 의미합니다.

before_action 필터의 모든 구성원 작업을 나열하지 않고 직접 할 수 있습니까?

편집 : 명확히하기 위해, 요점은 모든 구성원 경로를 얻고 :only 전달 될 배열을 생성하기 위해 몇 가지 레일 마법을 사용합니다. 그래서 all_member_routes 내 모델에 대한 모든 구성원의 경로를 반환 코드 조각은

before_action set_model only: all_member_routes 

과 같은 작업을 수행 할 수 있습니다.

또는 더 나은

,

before_action set_model, only_member_actions: true 

답변

5

showeditupdatedestroy 행동은 정확하게 모든 구성원 작업입니다. 그들은 모델을 찾아야하는 유일한 존재입니다.

나만의 회원 활동이 있다면 직접 회원 목록에 추가해야합니다.

before_action :set_item, only: [:edit, ..., :my_member_action] 

또는 당신이 그것을 필요로하지 않는 모든 수집 작업을 제외 할 :except 옵션을 사용할 수 있습니다

before_action :set_item, except: [:index, :create] 

이 방법을, 다른 멤버 조치를 추가하는 경우를, 당신은 늘 아무것도 변경해야 . 개인적으로 나는 명시 적으로 선호하고 :only을 사용하는 것을 선호합니다.

나는 쉬운 방법이 없다고 확신합니다. 자동으로 모든 회원 활동을 감지 할 수는 없습니다.


편집는 :

정말

당신은 controller_name 방법으로 컨트롤러의 이름에 액세스 할 수 있습니다 ... 당신이 그렇게해야한다고 생각하지만,하지 않습니다.

컨트롤러에 관련된 경로를 얻기 :

routes = Rails.application.routes.routes.select { |r| r.defaults[:controller] == controller_name } 

그런 다음, 나는 경로가 구성원 경로가 @parts 배열 :id이 포함되어 있다는 것입니다 경우 가장 좋은 방법은 볼 생각합니다. 어쩌면 당신은 더 튼튼한 방법을 찾을 수 있습니다.

그래서 내가 할 것이다 :

routes.select { |r| r.parts.include?(:id) }.map { |r| r.defaults[:action] }.map &:to_sym 

당신을 줄 것이다 그 : [:show, :preview, :my_challenges]에 대한

resources :users, only: [:index, :show], controller: 'accounts/users' do 
    member do 
    get :preview 
    get :my_challenges 
    end 
end 

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 
+0

routes.rb에서 추가 회원 작업을 정의 할 수 있습니다. 맞습니까? 그래서 나는 그것들도 포함시키고 싶습니다. – fotanus

+0

그래, 내가 말했듯이, 당신은 단지 2 개의 선택 만 갖고, 당신의'my_member_action'액션을리스트에 추가하거나': except'를 사용한다. – Robin

+0

모든 요령을 사용하여 모든 회원 경로를 얻고 나를위한 목록을 생성합니다 :-) – fotanus

2

당신이 before_action:only없이 또는 :except 옵션을 요구하는 경우에, 그것은 것 모든 회원 행동에 적용 :

컨트롤러와 ApplicationController로부터 상속 때문에이 특별한 경우
class ApplicationController < ActionController::Base 
    before_action :require_login 

    private 

    def require_login 
    unless logged_in? 
     flash[:error] = "You must be logged in to access this section" 
     redirect_to new_login_url # halts request cycle 
    end 
    end 
end 

, 그것은, 모든 컨트롤러에 모든 작업에서 로그인이 필요합니다.

당신이 그것을 필요로하는 경우에 당신은 before_action를 건너 뛸 수 있습니다 이런 식으로 (예를 들어, 당신은 당신이 시스템에 login 또는 sign up 원한다면 require_login을 건너 뛸 필요) :

class LoginsController < ApplicationController 
    skip_before_action :require_login, only: [:new, :create] 
end 

출처 : Rails Guides


따라서 특별한 경우 :

평소에는 UserController가 하나 있습니다.

class UserController < ApplicationController 
    def index 
    end 


    ... 
    /* you define here `index`, `create`, `update`, ... */ 
    def destroy 
    ... 
    end 
end 

그리고 당신은 모든 구성원의 행동과 별도의 컨트롤러 수 :

class UserCustomController < ApplicationController 
    before_action :set_model 

    def profile 
    ... 
    end 

    def preview 
    end 

    def custom_member_action 
    end 

    ... 
    /* all your member actions */ 
end 

이 방법이 많은 단일 컨트롤러를하는 것보다 실제로 더 나은 것입니다.

+0

내 질문에 대한 아이디어는 routes.rb에 새로운 멤버 경로를 추가하고 어떤 배열에도 아무것도 추가 할 필요가 없으며'only' 또는'except' 배열과 상관 없다. – fotanus

+0

예를 들어 User 모델에 대한 경로를 생성하는'resources : user'에 대한 의미입니까? – raviolicode

+0

'resources : user do member do get : profile done done' - 이것은 맞춤 회원 경로입니다. [레일 가이드] (http://guides.rubyonrails.org/routing.html#adding-more-restful-actions) – fotanus