Rails 4应用程序中的可变范围

时间:2014-06-02 04:06:13

标签: ruby-on-rails

我正在学习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

大多数人以某种方式说过。我不得不选择一个答案而且我做的那个对我来说是最直接的,也是对问题本身的评论。谢谢!

4 个答案:

答案 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| %>