2013-02-20 3 views
3

Мне нужно вызвать методы с другого контроллера. Каков наилучший способ? Например:Как вызвать методы другого контроллера

catalogues_controller.rb

class Site::CataloguesController < ApplicationController 
    respond_to :js, :html 

    def index 
    produc_list # call method other controller 
    end 
end 

other_controller.rb

class OtherController < ApplicationController 

    respond_to :js, :html 

    def produc_list 
    myObj = Catalagues.find(params[:id]) 
    render :json => myObj 
    end 
end 
+6

наследственного, общий модуль .. – apneadiving

+2

спасибо, пожалуйста, предоставьте пример, я новичок в рубин ... спасибо –

+1

Аналогичный вопрос был здесь спросил Http: // StackOverflow .com/questions/128450/best-practices-for-reusing-code-between-controller-in-ruby-on-rails для создания модулей checkout http://stackoverflow.com/questions/4906932/how-to-create- и-use-a-module-using-ruby-on-rails-3 – Noz

ответ

10

Вы могли бы реализовать модуль, и включить его в ваш контроллер.

Давайте назовем этот модуль «Продукты Helper»:

# In your app/helpers 
# create a file products_helper.rb 
module ProductsHelper 

    def products_list(product_id) 
    catalague = Catalagues.where(id: product_id).first 
    render :json => catalague 
    end 

end 

И затем, в контроллерах вы должны использовать этот метод:

class Site::CataloguesController < ApplicationController 
    include ProductsHelper 

    respond_to :js, :html 

    def index 
    products_list(your_id) # replace your_id with the corresponding variable 
    end 
end 
+1

Извините, папка app/helpers используется для размещения помощников для представления, а не для контроллера. – karlihnos

1

Если у вас есть RESTful маршруты (и Гости могут воспользоваться вспомогательные методы, которые приходят с ними), то вы должны просто иметь возможность использовать redirect_to для перенаправления любых действий, которые вы хотите вызвать,

# something like... controller_name_action_name_url 

# In your case, in the catalouges/index method 
# Note this also assumes your controller is named 'other' 
    redirect_to others_product_list_url(product_id) 
2

Вы можете вызвать отправку непосредственно по методу вашего контроллера. Передайте экземпляр ActionDispatch :: Response, и он будет заполнен ответом. Предполагая, что ответ JSON в этом примере:

def other_controller_method 
    req = ActionDispatch::Request.new(request.env) 
    resp = ActionDispatch::Response.new 
    YourControllerClass.dispatch(:your_controller_method_name, req, resp) 
    render json: resp.body, status: resp.status 
end 
Смежные вопросы