2012-05-14 23 views
6

Điều này nghe có vẻ kỳ lạ, nhưng hãy nghe tôi ... Tôi cần có khả năng tương đương với yêu cầu POST cho một trong các bộ điều khiển khác của tôi. Các SimpleController về cơ bản là một phiên bản đơn giản của một bộ điều khiển tiết hơn. Làm thế nào tôi có thể làm điều này một cách thích hợp?Rails: Cách POST nội bộ đến một hành động điều khiển khác?

class VerboseController < ApplicationController 
    def create 
    # lots of required params 
    end 
end 

class SimpleController < ApplicationController 
    def create 
    # prepare the params required for VerboseController.create 
    # now call the VerboseController.create with the new params 
    end 
end 

Có lẽ tôi đang suy nghĩ quá mức, nhưng tôi không biết cách thực hiện việc này.

+1

bạn có chắc là bạn cần điều đó không? Sẽ không phù hợp hơn để tạo tiết ngữ tiết như một phương thức Mô hình? –

+5

Mọi người đều tuyệt vời nói rằng nó không nên được thực hiện, nhưng đôi khi nó cần phải được thực hiện. Ví dụ: để khôi phục dữ liệu POST sau khi xác thực, v.v. –

+0

@TheDoctorĐiều gì khôi phục dữ liệu POST sau khi xác thực có lẽ là trường hợp * only * duy nhất mà điều này có ý nghĩa và thậm chí ở đó, tôi sẽ tìm cách tiếp cận khác. Nó chắc chắn không có ý nghĩa trong bối cảnh mà câu hỏi được hỏi. –

Trả lời

7

Liên lạc giữa các bộ điều khiển trong ứng dụng Rails (hoặc bất kỳ ứng dụng web nào theo cùng kiểu xem bộ điều hợp mô hình cho vấn đề đó) là điều bạn nên chủ động tránh. Khi bạn bị cám dỗ làm như vậy, hãy coi đó là dấu hiệu cho thấy bạn đang chiến đấu với các khuôn mẫu và khuôn khổ ứng dụng của bạn được xây dựng và bạn đang dựa vào logic đã được triển khai ở lớp ứng dụng của bạn.

Như @ismaelga đề xuất trong nhận xét; cả hai bộ điều khiển nên gọi một số thành phần phổ biến để xử lý hành vi được chia sẻ này và giữ cho bộ điều khiển của bạn "gầy". Trong Rails thường là một phương thức trên một đối tượng mô hình, đặc biệt là đối với kiểu hành vi sáng tạo mà bạn có vẻ lo lắng trong trường hợp này.

3

Bạn không nên làm điều này. Bạn đang tạo ra một mô hình? Sau đó, có hai phương pháp lớp trên mô hình sẽ tốt hơn nhiều. Nó cũng tách mã tốt hơn nhiều. Sau đó, bạn có thể sử dụng các phương pháp không chỉ trong bộ điều khiển mà còn các công việc nền (vv) trong tương lai.

Ví dụ nếu bạn đang tạo một Person:

class VerboseController < ApplicationController 
    def create 
    Person.verbose_create(params) 
    end 
end 

class SimpleController < ApplicationController 
    def create 
    Person.simple_create(params) 
    end 
end 

Sau đó, trong Person-mô hình mà bạn có thể đi như thế này:

class Person 
    def self.verbose_create(options) 
    # ... do the creating stuff here 
    end 

    def self.simple_create(options) 
    # Prepare the options as you were trying to do in the controller... 
    prepared_options = options.merge(some: "option") 
    # ... and pass them to the verbose_create method 
    verbose_create(prepared_options) 
    end 
end 

Tôi hy vọng điều này có thể giúp một chút. :-)

+1

Điều gì xảy ra nếu bạn muốn chuyển hướng đến một hành động khác:: tạo' để bạn có thể tạo một mô hình khác? – mbigras

Các vấn đề liên quan