在块内部渲染部分

时间:2013-12-06 08:53:29

标签: ruby-on-rails ruby ruby-on-rails-3.2

我是铁杆新手。在我的观点中,我有这个块afrikaans.html.erb

<% @afrikaans.each  do |course| %>
  <div class="course">
    <h3 class="course-name"><%= link_to course.name, course.url  %></h3>
    <% if I18n.locale == I18n.default_locale %>
    <p class="course-description_en"><%= course.description_en %></p>
    <% else %>
    <p class="course-description_se"><%= course.description_se %></p>
    <% end %>  

    <% if course.youtube_url.blank? == false %>
      <p><%= raw ApplicationHelper.youtube_embed(course.youtube_url) %></p>
    <% end %>     
    <% if course.language_id == 1 %>
    <p>&nbsp; <%=  image_tag("eng.png", :alt => "England", :class =>"round") %></p>
    <% else %>
    <p>&nbsp; <%= image_tag("swe.png", :alt => "Sweden", :class =>"round") %></p>
    <% end %>

    <% if ApplicationHelper.active_link?(course.url) == false %>
      <td><%= I18n.t('home.broken_link') %></td>
    <% end %>

    <p><%= course.nbr_of_votes %> <%= I18n.t('home.votes') %></p>
  </tr>
<% end %>  

我还有另一个文件swahili.html.erb具有相同的结构。我想实现类似的东西

afrikaans.html.erb

<% @afrikaans.each do |course| %>
 <%= render 'shared/partial' %>
<% end %>

所以我也可以

swahili.html.erb

<% @swahili.each do |course| %>
 <%= render 'shared/partial' %>
<% end %>

部分将包含块的一部分。我试过这个,但它不起作用。我的问题是这在轨道中甚至是可能的,如果是这样的话可能是什么问题。如果不可能,我有哪些选项可以避免重复,因为这两个文件具有相同的结构?

更新即可。这一个为我解决了。我只需要在块上添加:course => course,以便我的视图变成类似

的视图
<% @afrikaans.each  do |course| %>
  <%= render 'shared/course_body', :course => course %>
<% end %>  

当然,我没有将我的部分“部分”命名。这只是一个问题。感谢@Alexander Panasyuk的回答。

3 个答案:

答案 0 :(得分:2)

只需在 app / views 路径中创建共享目录即可。在共享中创建文件 _partial.html.erb

 <div class="course">
    <h3 class="course-name"><%= link_to course.name, course.url  %></h3>
    <% if I18n.locale == I18n.default_locale %>
    <p class="course-description_en"><%= course.description_en %></p>
    <% else %>
    <p class="course-description_se"><%= course.description_se %></p>
    <% end %>  
    <% if course.youtube_url.blank? == false %>
      <p><%= raw ApplicationHelper.youtube_embed(course.youtube_url) %></p>
    <% end %>     
    <% if course.language_id == 1 %>
    <p>&nbsp; <%=  image_tag("eng.png", :alt => "England", :class =>"round") %></p>
    <% else %>
    <p>&nbsp; <%= image_tag("swe.png", :alt => "Sweden", :class =>"round") %></p>
    <% end %>
    <% if ApplicationHelper.active_link?(course.url) == false %>
      <td><%= I18n.t('home.broken_link') %></td>
    <% end %>
    <p><%= course.nbr_of_votes %> <%= I18n.t('home.votes') %></p>
  </tr>

然后在 afrikaans.html.erb 中渲染您的部分内容:

<% @afrikaans.each do |course| %>
  <%= render 'shared/partial', :course => course %>
<% end %>

swahili.html.erb

<% @swahili.each do |course| %>
  <%= render 'shared/partial', :course => course %>
<% end %>

答案 1 :(得分:0)

这绝对是可能的,而且通常是一个好主意。

将来,如果您能够发布实际结果和/或错误消息,这将会很好,这在帮助您时会有很大帮助。

那就是说,我猜你需要将course变量传递给你的部分。变化

<%= render 'shared/partial' %>

<%= render 'shared/partial', :course => course %>

Partial无法访问其他partials中的局部变量。从这个意义上讲,您可以将每个partial视为同一对象实例上的单独方法。

答案 2 :(得分:0)

<%= render 'shared/partial', locale: 'swahili', course: course %> 

您将在部分设置为“swahili”和@course时分别拥有本地变量“locale”和“course”。另外,我建议将你的部分名称命名为“课程”。