我正在学习rails并且我有一个测试应用程序,其中我有列表和位置。他们之间有多对多的关系。我的索引页面列出了列表,并提供(构造中)过滤功能,包括检查位置。这是(部分)在index.html.erb
文件中完成的:
<ul class = "list-inline">
<% @locations.each do |location| %>
<li> <label class="checkbox"> <input type="checkbox" value="<%= location.id %>" id="inlineCheckbox1"> <%= location.name %> </label></li>
<% end %>
</ul>
它可以显示所有位置,每个名称左侧都有一个复选框。
现在,在添加或编辑列表时,我需要让用户选择要应用于列表的位置,因此我遵循相同的想法,并在_form.html.erb
文件中将以下代码作为一部分形式:
<select class="multiselect" multiple="multiple">
<% @locations.each do |location| %>
<option value="<%=location.id%>"><%=location.name%></option>
<% end %>
</select>
但是这一次,每当进入新页面或编辑页面时,我都会收到以下错误:
undefined method 'each' for nil:NilClass
使用
<% @locations.each do |location| %>
突出显示行。
我错过了什么?
(我已经省略了我认为与此问题无关的代码,以便现在压倒你,但我可能错了)。
解 感谢您加入您的答案。抱歉,我以前无法回复,因为我在工作,无法访问我的代码。 我感到非常羞怯......我想念现在显而易见的事情。控制器中的New和Edit操作的代码需要:
@locations = Location.all
大多数人以某种方式说过。我不得不选择一个答案而且我做的那个对我来说是最直接的,也是对问题本身的评论。谢谢!
答案 0 :(得分:1)
@locations
动作中设置了index
,但它不会永久存在。只需要足够长的时间来呈现索引页面。您可以在编辑操作中重新设置它,也可以只将代码更改为:
<% Location.all.each do |location| %>
答案 1 :(得分:1)
您可能没有在新动作中设置@locations
。
您可以这样设置:
@locations = Location.all
但是,在这种情况下,我建议您使用collection_select:
<%= f.collection_select(:location, Location.all, :id, :name, {multiple: true})%>
答案 2 :(得分:1)
请仔细检查您的操作以确保您的操作中包含@变量。我想它应该是这样的
@listing = Listing.find(params[:id])
@locations = @listing.locations
答案 3 :(得分:0)
本地视频
如果没有看到您的控制器或型号,问题就是使用partial
Rails partials
不要使用与父视图相同的@instance variables
- 您必须pass local
vars给他们(可能是因为他们的设计目的是用于应用程序的许多部分;因此传递本地变量使它们保持一致):
#Parent
<%= render partial: "form", locals: { locations = @locations } %>
#_form.html.erb
<% locations.each do |location| %>