2009-09-11 33 views
6

Tôi muốn thêm một vài biến mẫu vào trình điều khiển của mình, vì các biến trong câu hỏi được yêu cầu từ trong chế độ xem nhiều hơn một hành động. Tuy nhiên, ví dụ dưới đây không hoạt động như tôi mong đợi.Tại sao các biến mẫu của trình điều khiển của tôi không hoạt động trong các khung nhìn (Rails)

class ExampleController < ApplicationController 
    @var1 = "Cheese" 
    @var2 = "Tomato" 

    def show_pizza_topping 
    # What I want is the above instance vars from within the view here 
    end 

    def show_sandwich_filling 
    # What I want is the above instance vars from within the view here 
    end 
end 

Như tôi đã hiểu, Rails nhận các biến mẫu từ bộ điều khiển và làm cho chúng có sẵn trong chế độ xem. Nếu tôi gán các biến tương tự trong các phương thức hành động, nó hoạt động tốt - nhưng tôi không muốn làm điều đó hai lần. Tại sao con đường của tôi không hoạt động?

(Lưu ý: đây là một chút của một ví dụ rác, nhưng tôi hy vọng nó có ý nghĩa)

EDIT: Tôi đã tìm thấy câu trả lời cho câu hỏi này ở đây: When do Ruby instance variables get set?

EDIT 2: khi là thời điểm tốt nhất để sử dụng các bộ lọc như before_filter và phương thức khởi tạo?

Trả lời

10

Những loại điều này sẽ được xử lý trong before_filter. Một bộ lọc trước, giống như tên của nó, là một phương thức sẽ được gọi trước bất kỳ hành động nào, hoặc chỉ những phương thức mà bạn khai báo. Một ví dụ:

class ExampleController < ApplicationController 

    before_filter :set_toppings 

    def show_pizza_topping 
    # What I want is the above instance vars from within the view here 
    end 

    def show_sandwich_filling 
    # What I want is the above instance vars from within the view here 
    end 

protected 

    def set_toppings 
    @var1 = "Cheese" 
    @var2 = "Tomato" 
    end 

end 

Hoặc, bạn có thể có before_filter của bạn chỉ làm việc trên một trong những hành động của bạn

before_filter :set_toppings, :only => [ :show_pizza_topping ] 

Hope this helps.

EDIT: Dưới đây là một số thông tin khác về filters in ActionController.

+0

Có, cảm ơn bạn. Tuy nhiên, ngay sau khi đăng bài này tôi tìm thấy một câu trả lời (tôi cập nhật các câu hỏi để phản ánh điều này). Khi nào là thời điểm tốt nhất để sử dụng before_filter và/hoặc khởi tạo? –

+0

Tôi sẽ nói rằng bạn nên sử dụng before_filter nếu đó là bất kỳ loại công việc nào được thiết lập để hoạt động trên nhiều hành động. – theIV

+0

Là một ví dụ về bình luận mà tôi vừa để lại, khi xác minh rằng ai đó đã đăng nhập, bạn có thể có một phương thức trong 'ApplicationController' và áp dụng' before_filter' cho bất kỳ hành động nào yêu cầu người dùng đăng nhập. Có nghĩa là có mã đó trong mọi hành động yêu cầu ai đó đăng nhập. – theIV

2

Đó không phải là biến mẫu, đúng không?

class A 
    @x = 5 
    def f 
    puts @x 
    end 
end 

A.new.f 
=> nil 

Bạn đang xác định nó ở cấp lớp chứ không phải cấp độ cá thể. Khi "theIV" chỉ ra, bạn cần gán chúng bên trong một phương thức thể hiện.

+0

Tôi bị ấn tượng sai lầm, bạn có thể làm theo cách đó như trong các ngôn ngữ như C# hoặc Java: lớp ExampleController { chuỗi riêng var1 = "cheese"; // ... } –

+0

Trong Java, ở đó, bạn đang khai báo một biến mẫu; trong Ruby, các biến của bạn không được khai báo, vì vậy không có sự tương đương thực sự. Bất cứ thứ gì bên trong lớp "Ruby" .. "cuối cùng" về cơ bản được đánh giá, vì vậy nó có thể giúp nghĩ về điều đó tương đương với một bộ khởi tạo tĩnh Java. – Ken

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