2013-07-19 32 views
7

Đang thử nghiệm content_for trong ứng dụng đường ray 3.2 của tôi và làm theo hướng dẫn đường ray nhưng chúng cụ thể cho các tệp thực tế và tôi dường như không nhận được lợi nhuận hoạt động:cách sử dụng content_for để nội dung hiển thị trong bố cục

tập tin

application.html.erb:

<!DOCTYPE html> 
<html> 
<head> 
... 
</head> 

<body> 




<%= yield :navigation %> #shouldn't this load the content_for block named :navigation specified in the _main_nav.html.erb partial? 

<%= yield %> #this load the index page content 


</body> 
</html> 

tôi tạo ra một _main_nav.html.erb file layout (tôi biết tôi có thể làm với <% = làm 'layouts/tiêu đề' %> nhưng tôi đang cố gắng để sử dụng content_for thay thế) _main_nav.html.erb là:

<% content_for :navigation do %> 
<ul> 
<li>Home</li> 
</ul> 

<% end %> 

Cách chúng tôi đọc RailsGuide http://guides.rubyonrails.org/layouts_and_rendering.html#using-the-content-for-method điều này sẽ hoạt động. Nhưng nó không. Tôi không gặp lỗi. Có vẻ đơn giản nhưng tôi stumped.

Khi tôi đi đến tập tin index.html.erb tôi, tôi sẽ mong đợi để xem kết quả này:

  • Home

Trả lời

6

OK, tôi nghĩ mình có giải pháp cho việc này. Mã của bạn:

<% content_for :navigation do %> 
<ul> 
<li>Home</li> 
</ul> 
<% end %> 

nên ở phía trên cùng của tập tin đó là tải. _header.html.erb của bạn là một phần. Nếu bạn di chuyển mã này vào lượt xem/tasks/new.html.erb thì nó hoạt động như mong đợi.

Tuy nhiên, cho nó hoạt động như bạn muốn, sau đó bạn cần phải điều chỉnh tập tin application.html.erb của bạn:

<p>this is where we should see the "Home" link appear that is defined in _header.html.erb:</p> 
<section class="header"> 
<% render 'layouts/header' %> 
<%= yield :navigation %> 
</section> 

Thông báo, mà tôi đã gọi là render thẻ ERB mà không có dấu =. Điều này có nghĩa là tôi không thấy nội dung của phần tiêu đề, nhưng nó tải. Nếu bạn bao gồm dấu = thì nó vẫn hoạt động nhưng cũng hiển thị bất kỳ nội dung nào khác mà bạn có thể có trong một phần. Lưu ý: Thẻ kết xuất phải ở trên/trước thẻ lợi nhuận.

+0

Cảm ơn @hatStephensWork Tôi sẽ dùng thử. – akkdio

+0

không phải lo lắng @akkdio, tôi cũng đã thực hiện yêu cầu kéo đến repo GitHub của bạn. Mọi câu hỏi chỉ hỏi. Tôi là một người mới, nhưng tôi nghĩ rằng tôi hiểu những gì đang xảy ra với cái này! – HatStephensWork

9

Tôi tin vào những gì bạn muốn có là có một cái nhìn sẽ chứa khối content_for của bạn. Vì vậy, một ví dụ sẽ là nếu bạn có điều sau đây:

index.html.erb

<% content_for :head do %> 
    <%= stylesheet_link_tag 'users' %> 
    #Above this will load the users stylesheet 
<% end %> 

<h2>Example</h2> 
    <ul> 
    <% @users.each do |users| %> 
     <li><%= user.name %></li> 
    <% end %> 
    </ul> 

Sau đó, để đầu ra những gì bên trong users stylesheet chúng tôi có thể mang lại và vượt qua trong những biểu tượng của tên của content_for.

Application.html.erb

<!-DOCTYPE html> 
     <html> 
     <head> 
     <%= yield :head%> 
      <title>This is my title</title 
     </head> 
     <body> 
     <p>This is a test</p> 
     <%= yield %> 
    </html> 

Vì vậy, để xem xét whats xảy ra ở đây là rằng, trong ví dụ của tôi, tôi đang nói tôi có một stylesheet users mà tôi muốn để nạp vào <head></head> của ứng dụng của tôi .html.erb. Để làm điều này, tôi đặt số content_for là trình trợ giúp của Rails và cung cấp cho nó mã định danh sysmbol là head, sau đó được gọi trong số application.html.erb nơi tôi làm yeild :head. Vì vậy, những gì tôi nhận được ứng dụng của tôi để làm là khi index.html.erb của tôi cho trang đó đang được hiển thị, application.html.erb sẽ tải biểu định kiểu users của tôi. Hy vọng điều này sẽ xóa mọi thứ cho bạn.

Cập nhật giải thích

Để thêm vào này một điều mục đích của sự kết hợp của việc sử dụng content_for với yield là để cho phép bạn đưa dữ liệu vào cách bố trí ứng dụng từ BẤT CỨ xem. Như một ví dụ khác. Bạn có thể có những điều sau đây:

<% content_for :title do %> My Title<% end %> 

đây khi bộ điều khiển làm cho mẫu xem và kết hợp nó với cách bố trí ứng dụng, văn bản My title sẽ được thay thế. yield(:head) giúp bạn dễ dàng thêm các yếu tố khác vào trang cụ thể nếu cần. Hãy xem ví dụ sau:

app/views/layouts/application.html.ERB

<% if content_for?(:navbar) %> 
    <%= yield(:navbar) %> 
<% else %> 
    <%# default navbar %> 
    <section class="navbar"></section> 
<% end %> 

app/views/blah/index.html.erb

<% content_for(:navbar) do %> 
    <section class="navbar"></section> 
<% end %> 

Và một lưu ý thêm không chắc chắn cách phát triển ứng dụng của bạn của bạn hoặc những gì khuôn khổ thiết kế của bạn sử dụng nhưng bạn cũng có thể hãy xem Rails-Bootstrap-Navbar. Cũng có thể là một thay thế.

+0

David, Cảm ơn bạn. Bạn là đúng trong ví dụ của tôi không giống như hướng dẫn -I đã cập nhật nó để cụ thể hơn về những gì tôi đang cố gắng làm ... Có vẻ như khối content_for nên được abled để được gọi là bất cứ nơi nào trong quan điểm bằng cách chỉ cần đặt <% = yield: header%> tuy nhiên tôi thậm chí không thể lấy ví dụ đơn giản này để làm việc. Tôi không được hiểu hay phải làm điều gì khác để mọi thứ xuất hiện ... – akkdio

+0

@akkdio xem câu trả lời cập nhật. – David

+0

David, tôi thực sự đánh giá cao việc bạn dành thời gian để hiểu câu hỏi của tôi và xin lỗi nó hơi khó hiểu ... Tôi thấy những gì bạn đã làm và hiểu nó vì nó liên quan đến bản định kiểu. Nơi tôi không rõ ràng là tại sao khi tôi cố gắng tạo một nav để sử dụng content_for không có gì xuất hiện? Xin vui lòng nếu bạn có thể nhìn vào ví dụ làm lại của tôi và cho tôi biết nếu bạn phát hiện bất cứ điều gì sai trong suy nghĩ của tôi. – akkdio

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