2010-04-26 31 views
9

Khi một hành động trong bộ điều khiển được gọi, tôi có thể gọi một hành động khác từ hành động đó không?Tôi có thể gọi một hành động trong một hành động khác (trong bộ điều khiển đường ray) không?

Và điều gì sẽ xảy ra nếu cả hai hành động có một số mẫu để hiển thị?

+0

Nếu người ta phải làm điều này, hãy nhớ đặt phương thức được gọi là "riêng tư", trừ khi đó là tuyến đường công khai có sẵn theo cách riêng của mình –

Trả lời

14

Có thể, nếu có trong cùng một bộ điều khiển.

Gọi zoo sẽ cung cấp mẫu cho sở thú với các trường hợp cho @x@a. Không foo hoặc thanh sẽ được trả lại. Nếu bạn đã đặt rõ ràng phương thức render, thì bạn có thể gặp phải lỗi kết xuất kép, trừ khi bạn return trước khi hiển thị thứ hai được gọi.

def foo 
    @x = 1 
end 

def bar 
    @a = 2 
end 

def zoo 
    foo 
    bar 
end 
+0

nếu tôi đặt phương thức hiển thị thành 'bar', sau đó khi 'sở thú' được gọi, nó sẽ làm cho mẫu của thanh (tức là bar.html.erb)? – Bat

+0

Có, nhưng bạn sẽ cần phải 'trở lại thanh' trong' sở thú ', nếu không bạn sẽ nhận được một lỗi DoubleRender. Có lẽ bạn đang trừu tượng hóa tốt hơn logic được chia sẻ giữa 'bar' và' zoo' thành một phương thức được bảo vệ. –

+0

Cảm ơn rất nhiều, bạn thân! – Bat

0

Bạn có thể sử dụng redirect_to để gọi một hành động khác trong bộ điều khiển của mình. Để hiển thị một mẫu bên trong một mẫu khác, bạn có thể sử dụng partials và/hoặc bố cục.

+3

'redirect_to' không gọi hành động khác (theo nghĩa gọi phương thức), thay vào đó nó sẽ yêu cầu trình duyệt yêu cầu hành động khác. Các hành động chỉ là các phương thức, được gọi bởi 'ActionController' khi nó xử lý một yêu cầu. Họ có thể được gọi từ các hành động khác như @TheWho cho thấy. –

0

Ai chính xác về cách gọi hành động, nhưng nếu bạn gọi hành động trong một hành động bạn cần phải cấu trúc lại mã của bạn để rút ra logic mà bạn đang cố gắng hoàn thành hành động của chính mình, cho phép mỗi hành động hiển thị mẫu của riêng nó.

-1

Có, bạn có thể thực hiện việc này. Và nếu bạn có thể có thể làm cho một con số không một bố trí sao cho nó sẽ hiển thị trong quan điểm của bạn một cách tốt đẹp

nói (ví dụ sau này có 'my_controller' như cách bố trí)

class my_controller < application_controller 

    def my_parent_method 
    @text_from_my_child_method = child_method 
    end 

    def child_method 
    return 'hello from child_method' 
    render :layout => false #here we are making the child_method layout false so that it #will not effect the parent method 
    end 

end 

và trong bạn 'my_parent_method.rhtml' (xem) bạn có thể sử dụng biến

<%= @text_from_my_child_method %> and it should print 'hello from child_method' 

hy vọng điều này giúp

cổ vũ, Sameera

+2

'render' sẽ không bao giờ được gọi trong' child_method'. Bạn 'return'ing ra khỏi phương thức trước khi dòng' render' được thực thi. Bạn đang cố gắng cho thấy rằng 'child_method' sẽ không hiển thị một khung nhìn? (Điều đó có thể được thực hiện cụ thể bằng cách khai báo 'child_method' là' private'.) –

-1

Nếu bạn muốn làm điều đó bởi vì có một số loại mã phổ biến trong cả hai hành động có thể tốt hơn là cấu trúc lại mã này thành một before_filter.

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