Tôi cần gọi hành động tạo trong bộ điều khiển A, từ bộ điều khiển B.
Lý do là tôi cần chuyển hướng khác khi tôi đang gọi từ bộ điều khiển B.
Nó có thể được thực hiện trong Rails không?
Tôi cần gọi hành động tạo trong bộ điều khiển A, từ bộ điều khiển B.
Lý do là tôi cần chuyển hướng khác khi tôi đang gọi từ bộ điều khiển B.
Nó có thể được thực hiện trong Rails không?
Câu trả lời:
Bạn có thể sử dụng chuyển hướng đến hành động đó:
redirect_to your_controller_action_url
Thêm về: Hướng dẫn đường ray
Để chỉ hiển thị hành động mới:
redirect_to your_controller_action_url and return
render
thay thế redirect_to
. Bạn nói gì, @Spyros?
redirect_to
không cho phép sử dụng post: :method
và điều này có thể hữu ích đặc biệt khi chuyển hướng đến một create
hành động đã tồn tại của một bộ điều khiển khác như @ddayan đã hỏi ở lần đầu tiên. Tôi gặp một tình huống tương tự trong đó trong một số tình huống, tôi nên tạo một đối tượng khác. Kêu gọi người kia create
hành động có thể máy sấy ..
Để sử dụng một bộ điều khiển từ một bộ điều khiển khác, hãy làm như sau:
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
thì bạn sẽ làmcontroller_you_want.process(:action_you_want)
render status: :ok, json: JSON.parse(controller.render(:action_you_want).first)
dường như làm việc để trở về JSON từ bộ điều khiển khác
controller_you_want.request
nhưng không thể làm cho việc kích hoạt này chuyển một phiên bản băm hoặc tham số.
params
trở nên có sẵn để controller_you_want
bằng cách thiết lập request
trong dòng thứ 3. Đó có phải là những gì bạn đang hỏi?
render html: controller_you_want.process(:action_you_want)
Logic bạn trình bày không phải là MVC, sau đó không phải là Rails, tương thích.
Bộ điều khiển hiển thị một chế độ xem hoặc chuyển hướng
Một phương thức thực thi mã
Từ những cân nhắc này, tôi khuyên bạn nên tạo các phương thức trong bộ điều khiển và gọi chúng từ hành động của bạn.
Thí dụ:
def index
get_variable
end
private
def get_variable
@var = Var.all
end
Điều đó nói rằng bạn có thể làm chính xác như vậy thông qua các bộ điều khiển khác nhau và triệu hồi một phương thức từ bộ điều khiển A khi bạn đang ở trong bộ điều khiển B.
Từ vựng là vô cùng quan trọng đó là lý do tại sao tôi nhấn mạnh nhiều.
get_variable
bây giờ có thể được gọi từ một bộ điều khiển khác?
Bạn có thể sử dụng url_for
để lấy URL cho bộ điều khiển và hành động, sau đó sử dụng redirect_to
để truy cập 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)
sẽ dẫn đến kết quả /contorller_name/action_name?param1=val1¶m2=val2
. Xem tài liệu
Đây là cách thực hành không tốt khi gọi một hành động của bộ điều khiển khác.
Bạn nên
Ý kiến cá nhân của tôi:
Cách tiếp cận thứ ba là điều tôi đã từng làm thường xuyên. Vì vậy, tôi sẽ chỉ ra một ví dụ nhỏ.
def create
@my_obj = MyModel.new(params[:my_model])
if @my_obj.save
redirect_to params[:redirect_to] || some_default_path
end
end
Vì vậy, bạn có thể gửi cho tham số hành động này redirect_to
, có thể là bất kỳ đường dẫn nào bạn muốn.
/models
hoặc một lớp hoặc mô-đun thông thường trong /lib
). Vấn đề duy nhất là nếu bộ điều khiển của bạn giao tiếp với chế độ xem thông qua các biến cá thể - bạn sẽ phải sửa lỗi trùng lặp đó theo cách khác.
Có lẽ logic có thể được trích xuất thành một người trợ giúp? người trợ giúp có sẵn cho tất cả các lớp và không chuyển quyền kiểm soát. Bạn có thể kiểm tra bên trong nó, có lẽ là tên bộ điều khiển, để xem nó được gọi như thế nào.
Thành phần để giải cứu!
Với lý do, thay vì gọi các hành động trên các bộ điều khiển, người ta nên thiết kế bộ điều khiển để tách các phần được chia sẻ và tùy chỉnh của mã. Điều này sẽ giúp tránh cả hai - trùng lặp mã và phá vỡ mô hình MVC.
Mặc dù có thể được thực hiện trong một số cách khác nhau, sử dụng mối quan tâm ( thành phần ) là một thực hành tốt.
# 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
Hy vọng rằng sẽ giúp.
Tách các chức năng này khỏi bộ điều khiển và đưa chúng vào tệp mô hình. Sau đó, bao gồm tệp mô hình trong bộ điều khiển của bạn.