我有两个部分,几乎完全相同,除了一个是完整视图,另一个是紧凑。他们都在'项目'查看,但一个正常,另一个给出错误:
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)
我不明白部分是如何在完全相同的位置,并使用完全相同的方式,在完全相同的位置,但一个工作,另一个不工作。是否有我过去可能做过的代码,我错过了这使得这项工作?
答案 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;这样做的方法?现在似乎工作得很好......