Мені потрібно викликати дію створення в контролері 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_for
URL-адресу для контролера та дії, а потім 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
Сподіваюся, що це допомагає.
Відокремте ці функції від контролерів і помістіть їх у файл моделі. Потім додайте файл моделі у свій контролер.