Мені потрібно викликати дію створення в контролері A, від контролера B.
Причина в тому, що мені потрібно переадресовувати інакше, коли я дзвоню з контролера B.
Чи можна це зробити в Rails?
Мені потрібно викликати дію створення в контролері A, від контролера B.
Причина в тому, що мені потрібно переадресовувати інакше, коли я дзвоню з контролера B.
Чи можна це зробити в Rails?
Відповіді:
Ви можете використовувати переспрямування до цієї дії:
redirect_to your_controller_action_url
Детальніше про: Посібник по рейках
Щоб просто виконати нову дію:
redirect_to your_controller_action_url and return
renderзамість цього повинен бути redirect_to. Що ти скажеш, @Spyros?
redirect_toце не дозволяє використовувати, post: :methodі це може бути корисно, особливо для перенаправлення до вже існуючої createдії іншого контролера, як @ddayan запитав у перший раз. У мене схожа ситуація, коли в якійсь ситуації я повинен створити інший об’єкт. Зателефонувати на іншу createдію можна DRYer ..
Щоб використовувати один контролер від іншого, зробіть це:
def action_that_calls_one_from_another_controller
controller_you_want = ControllerYouWant.new
controller_you_want.request = request
controller_you_want.response = response
controller_you_want.action_you_want
end
controller_you_wantви зробили бcontroller_you_want.process(:action_you_want)
render status: :ok, json: JSON.parse(controller.render(:action_you_want).first)здається, працює над тим, щоб повернути JSON з іншого контролера
controller_you_want.requestале не змогли отримати цю стрільбу, передаючи екземпляр хешу чи параметрів.
paramsСтають доступними controller_you_wantшляхом установки requestв 3 - му рядку. Це ти просиш?
render html: controller_you_want.process(:action_you_want)
Логіка, яку ви представляєте, не MVC, то не Rails, сумісна.
Контролер надає перегляд або переадресацію
Метод виконує код
З цих міркувань раджу створити методи у своєму контролері та викликати їх у своїй дії.
Приклад:
def index
get_variable
end
private
def get_variable
@var = Var.all
end
Це означає, що ви можете зробити точно так само через різні контролери та викликати метод з контролера A, поки ви перебуваєте в контролері B.
Лексика надзвичайно важлива, тому я дуже наполягаю.
get_variableтепер можна телефонувати з іншого контролера?
Ви можете використовувати url_forURL-адресу для контролера та дії, а потім redirect_toперейти до цієї URL-адреси.
redirect_to url_for(:controller => :controller_name, :action => :action_name)
redirect_to url_for(:controller => :controller_name, :action => :action_name, :param1 => :val1, :param2 => :val2), результати в /contorller_name/action_name?param1=val1¶m2=val2. Дивіться документи
Це погана практика викликати іншу дію контролера.
Ти повинен
Моя думка:
Третій підхід - це те, що я часто робив. Тому я покажу невеликий приклад.
def create
@my_obj = MyModel.new(params[:my_model])
if @my_obj.save
redirect_to params[:redirect_to] || some_default_path
end
endТаким чином, ви можете надіслати до цієї дії redirect_toпарам, який може бути будь-яким потрібним вам шляхом.
/modelsабо звичайний клас чи модуль в /lib). Єдина проблема - якщо ваш контролер спілкується з представленням через змінні екземпляра - вам доведеться виправити це дублювання іншим способом.
Можливо, логіку вдасться витягти в помічника? помічники доступні для всіх класів і не передають контроль. Ви можете перевірити в ньому, можливо, ім'я контролера, щоб побачити, як він викликався.
Склад на допомогу!
Враховуючи причину, а не викликати дії між контролерами, слід сконструювати контролери для відокремлення спільних та спеціальних частин коду. Це допоможе уникнути дублювання коду та порушення схеми MVC.
Хоча це можна зробити декількома способами, використовуючи проблеми ( склад ) - це хороша практика.
# controllers/a_controller.rb
class AController < ApplicationController
include Createable
private def redirect_url
'one/url'
end
end
# controllers/b_controller.rb
class BController < ApplicationController
include Createable
private def redirect_url
'another/url'
end
end
# controllers/concerns/createable.rb
module Createable
def create
do_usefull_things
redirect_to redirect_url
end
end
Сподіваюся, що це допомагає.
Відокремте ці функції від контролерів і помістіть їх у файл моделі. Потім додайте файл моделі у свій контролер.