两个相似的部分,一个给出错误,其他是好的

时间:2014-05-28 04:18:43

标签: ruby-on-rails ruby arrays partials

我有两个部分,几乎完全相同,除了一个是完整视图,另一个是紧凑。他们都在'项目'查看,但一个正常,另一个给出错误:

projects/_project.html.erb

<div class="pure-u-1-3">
<%= link_to project do %>
  <div class="project">
    <h4 class="red marginless"><%= truncate( project.title, length: 22, separator: ' ') %></h4>
    <p class="left marginless"><strong>By:</strong> <%= project.user.username %><br>
    <strong>Genres:</strong> <%= truncate( project.genre2, length: 25, separator: ' ') %><br><br>

    <strong>Description:</strong><br>
    <%= truncate( project.description, length: 60, separator: ' ') %><br>

    <strong>Needs:</strong><br>
    <%= truncate( project.looking_for, length: 60, separator: ' ') %></p>
  </div>
<% end %>

<% if @projects.size == 0 %>
 <em> no projects found with that criteria </em>
<% end %>
</div>

projects/_short.html.erb

<div class="pure-u-1-3">
<%= link_to project do %>
  <div class="project">
    <h4 class="red marginless"><%= truncate( project.title, length: 22, separator: ' ') %></h4>
    <p class="left marginless"><strong>By:</strong> <%= project.user.username %></p>
  </div>
<% end %>
</div>

现在,这是使用这些部分的视图的一部分:

dashboards/index.html.erb

<% if @projects.length > 0 %>
 <div class="pure-u-1" id="projects"><h3 class="red"><%= current_user.username %>'s Owned Projects</h3>
  <%= render :partial => 'projects/short', :collection => @projects %>
 </div>
<% end %>

当我有&#39;项目/项目&#39;它完美无缺,没有问题。 当我把项目/短期&#39;它给了我这个错误:

undefined local variable or method `project'

除非我使用@project,否则在_short上使用word项目时会出现此错误,但它会给我这个错误:

undefined method `title' for nil:NilClass (same for user)

我不明白部分是如何在完全相同的位置,并使用完全相同的方式,在完全相同的位置,但一个工作,另一个不工作。是否有我过去可能做过的代码,我错过了这使得这项工作?

2 个答案:

答案 0 :(得分:1)

您需要为as: :project电话提供render partial选项:

<% if @projects.length > 0 %>
 <div class="pure-u-1" id="projects"><h3 class="red"><%= current_user.username %>'s Owned Projects</h3>
  <%= render :partial => 'projects/short', :collection => @projects, as: :project %>
 </div>
<% end %>

这将使project局部变量在部分projects/short内可用。

您收到错误的原因是(来自Using render内有关呈现集合的文档):

  

当使用复数集合调用partial时,则   部分的个别实例可以访问该成员   通过以partial为名称的变量呈现集合。

答案 1 :(得分:0)

好的,所以在我真正看到上面的答案之前,我还在整理文档,从我最好的理解,我实际上只是改变了所说的项目现在紧凑的所有内容:

<h4 class="red marginless"><%= truncate( compact.title, length: 22, separator: ' ') %></h4>
<p class="left marginless"><strong>By:</strong> <%= compact.user.username %></p> 

这是&#39;错误&#39;这样做的方法?现在似乎工作得很好......