2011-07-25 31 views
22

Tôi khá mới với đường ray và tôi đã tự hỏi làm thế nào tôi có thể hiển thị một biến từ bộ điều khiển của tôi vào quan điểm của tôi.Rails 3: Biến hiển thị từ bộ điều khiển ở chế độ xem

Về cơ bản, tôi có 2 file: articles_controller.rb_article.html.erb

Trong tập tin điều khiển của tôi, tôi có một biến @article_votes mà tôi muốn hiển thị trên quan điểm của tôi. Tôi đã thử sử dụng <%= @article_votes %> nhưng nó không hiển thị bất cứ điều gì cả.

Có ai có bất kỳ hướng dẫn nào không? Cảm ơn bạn!

+0

Bạn có chắc chắn @article_votes chứa thứ gì đó không? Bạn có thể thử "đặt article_votes: # {@ article_votes}" trong bộ điều khiển của bạn và kiểm tra nhật ký của bạn/development.log để xem liệu có bất kỳ đầu ra nào –

+4

KHÔNG BAO GIỜ sử dụng đặt trong ứng dụng Rails! Sử dụng logger.debug thay vì xem phần 2.3 tại đây http://guides.rubyonrails.org/debugging_rails_applications.html hoặc sử dụng debig đơn giản trong chế độ xem. Ngoài ra tài liệu trên trang đó – jamesc

Trả lời

43

Không chắc thế nào mới bạn để đường ray. Bất kỳ biến mẫu nào bạn xác định bên trong bộ điều khiển đều có thể truy cập được bên trong các khung nhìn.

Vì vậy, nếu @article_votes được định nghĩa trong bộ điều khiển, viết

<pre> 
    <%= @article_votes.inspect %> 
</pre> 

đâu đó theo quan điểm của bạn nên hiển thị trong trang của bạn.

Tuy nhiên, _article.html.erb không được hiển thị theo mặc định. Nếu bạn có phương thức show trong ArticlesController, chế độ xem được gọi là show.html.erb được hiển thị. Đây là cách tiếp cận chung, do đó, đối với phương thức index, phương thức này phải được gọi là index.html.erb.

Hy vọng điều này sẽ hữu ích.

+0

Điều đó đã làm được! Cảm ơn bạn đã giúp đỡ! – Ben

1

_article.html.erb là chế độ xem một phần. Bạn có chắc chắn rằng trong trình duyệt bạn đang hiển thị hành động thích hợp không?

2

Kết quả của <% = @article_votes%> sẽ phụ thuộc vào những gì lớp @article_votes là một đối tượng và hay không, bạn đang thực sự render mà _article.html.erb mẫu

Chỉ cần gọi <% = render: partial => 'article'%> trong tệp index.html.erb hoặc bất kỳ tệp .html.erb nào được đặt tên sau hành động bộ điều khiển mà bạn đang sử dụng để cố gắng hiển thị chế độ xem này.

Thông thường đến từ một bộ điều khiển @article_votes sẽ là một mảng (theo quy ước) tên số nhiều biểu thị một mảng các đối tượng và một tên duy nhất biểu thị một đối tượng cụ thể của một lớp ActiveRecord dựa trên một bảng gọi là article_votes có chứa tất cả các giá trị được giữ trong bảng cho một bản ghi cụ thể.

Hãy chắc chắn rằng @article_votes là một thể hiện của một lớp khác hơn là con số không

Nếu nó chỉ là một chuỗi sau đó (@article_votes = "Một chuỗi") sau đó bạn sẽ thấy rằng theo quan điểm của bạn. Nếu đó là kết quả của cuộc gọi ActiveRecord để tìm tất cả các đối tượng từ mô hình ArticleVotes thì nó sẽ là một mảng sẽ trống nếu không có gì trong bảng. Bạn sẽ cần lấy một đối tượng cụ thể từ mảng đó và sau đó bạn sẽ cần phải chọn phương thức nào có sẵn trên đối tượng mà bạn muốn hiển thị

ví dụ:

Giả sử bảng article_votes có một cột được gọi là tên trên đó và bạn có 1 article_vote record trong bảng đó với giá trị 'This is a name', sau đó mã sau trong hành động điều khiển sẽ giúp bạn hiển thị " Đây là một tên" trên màn hình của bạn

@article_vote = ArticleVote.first

Nếu bạn có <% = @ article_vote.name%> trong một phần và giả định rằng bạn thực sự đang render của bạn mà phần

2

Nếu bạn đang gọi một phần, bạn sẽ cần phải chuyển biến @article_votes cho nó.

<@= render 'article', :article_votes => @article_votes %> 

Bây giờ trong vòng một phần của bạn, bạn có thể sử dụng

<%= article_votes %> 
+0

gọi <% = article_votes%> mặc dù rất có thể sẽ không có kết quả mong muốn nó sẽ cần phải giống như article_votes.some_attribute – jamesc

+1

Vì '@ article_votes' là một biến mẫu của bộ điều khiển, không cần để vượt qua biến trong, mặc dù nó có thể được coi là thực hành tốt cho partials để không dựa vào các biến cá thể (điều này khuyến khích tái sử dụng trong các khung nhìn khác). Thứ hai, những gì @ jamesw nói: tôi thích viết 'article_votes.inspect' nếu bạn không biết những gì mong đợi: nó sẽ tạo ra một chuỗi dễ đọc trong mọi trường hợp. – nathanvda

+0

Tôi nên rõ ràng hơn. Biến 'article_votes' sau đó sẽ có sẵn trong phần. Vì vậy, có, bạn có thể gọi bất kỳ thuộc tính nào liên quan đến biến. [Như được mô tả ở đây] (http://rails-bestpractices.com/posts/27-replace-instance-variable-with-local-variable) – Trent

0

Một điều quan trọng khác mà tôi vừa gặp phải là các giá trị biến của bạn phải được đặt trước khi cuộc gọi kết thúc.

Tôi có một khối "tạo" chuẩn, nếu mô hình không được lưu, nó sẽ trả về lỗi. Trong trường hợp này, tôi đã thiết lập một biến cá thể để tái kết xuất sẽ di chuyển đến biểu mẫu có lỗi.

Tôi không thể hiểu tại sao biến của tôi không được đặt khi tôi đặt rõ ràng. Ngay sau khi tôi di chuyển nó lên trên "render action:: new" nó hoạt động.

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