2015-04-03 58 views
0

我想为各种控制器添加一个状态问题,因为所有这些控制器共享相同的状态功能。Rails 4 Controller Concern初始化程序

状态可以是“活动”,“不活动”或“存档”。如果添加到特定的控制器前。 bars_controller这些方法应该是这样的:

def activate 
    @bar.activate! 
    redirect_to(:back) 
end 

def deactivate 
    @bar.deactivate! 
    redirect_to(:back) 
end 

def archive 
    @bar.archive! 
    redirect_to(:back) 
end 

我提出上面我所关注的被称为Foo和我在我的控制器,这样包括富:搬家时

include Foo 

我有问题这些方法令人担忧,是Model实例未定义。

如何概括我关心的代码中的“@bar”部分?这将使我能够使用包括Baz在内的多个模型实例的关注。我试过使用“self”,但是引用了Controller实例而不是Model实例。

+0

如果我理解这一点没错,你将需要初始化这个@bar某处。由于您在许多控制器中使用它,因此在应用程序控制器中执 – 2015-04-03 12:24:10

+0

您的'@ bar'定义在哪里?你应该有一个像'def find_bar @bar = Bar.find(params [:id]);结束'某处。 – pierallard 2015-04-03 12:53:47

+0

@ForgetTheNorm,“bar”在“before_action”中定义。如果它在一个特定的控制器本身,那么“bar”不是问题。当我将这些方法转移到更普遍的问题时,会出现问题。我不能称之为“酒吧”,因为我需要将“关注”用于“巴兹”。 – Herm 2015-04-03 13:17:50

回答

0

您的关注可能是这样的:

module Foo 
    extend ActiveSupport::Concern 

    def activate 
     render text: bar.to_json 
    end 

    def deactivate 
     render text: bar.to_json 
    end 

    def archive 
     render text: bar.to_json 
    end 

    private 

    def bar 
     # 'demodulize' isn't necessary if you're working outside of namespaces 
     params[:controller].classify.demodulize.constantize.find(params[:id]) 
    end 

end 

和你的路线将使用一个关注以及受益:

concern :statusable do 
    member do 
     get :activate 
     get :deactivate 
     get :archive 
    end 
end 

resources :alphas, :bravos, :charlies, concerns: :statusable 
相关问题