2014-12-17 4 views
0

Я получаю NoMethodError в Rooms # index, в частности неопределенный метод `boolean_array_from_am Facilities_integer 'для #. Я определил «boolean_array_from_amvents_integer» в модели Room.rb, но я не собираю его. Любая помощь будет оценена по достоинству.NoMethodError in Rooms # index

room.rb

class Room < ActiveRecord::Base 

    validates :amenities, presence: true 

    def self.amenities_list 
    ["Smoking Allowed", 
    "Pets Allowed", 
    "TV", 
    "Cable TV", 
    "Internet", 
    "Wireless Internet", 
    "Air Conditioning", 
    "Heating", 
    "Elevator in Building", 
    "Handicap Accessible", 
    "Pool", 
    "Kitchen", 
    "Free parking on premise", 
    "Doorman", 
    "Gym", 
    "Hot Tub", 
    "Indoor Fireplace", 
    "Buzzer/Wireless Intercom", 
    "Breakfast", 
    "Family/Kid Friendly", 
    "Suitable for Events", 
    "Washer", 
    "Dryer"] 
    end 

def boolean_array_from_amenities_integer 
    [].tap do |amenities_list| 
    Room.amenities_list.length do |order| 
     amenities_list << (self.amenities & 2 ** order > 0) 
     end 
     end 
     end 

    end 

rooms_conroller.rb

class RoomsController < ApplicationController 

    before_filter :require_current_user!, only: [:new, :create] 

    def index 
    @room = Room.all 
    end 

    def show 
    @room = Room.find(params[:id]) 
    end 

    def new 
    @room = Room.new 
    end 

    def create 
    @room = Room.new(params[:room]) 

    @room.set_amenities_from_options_list!(params[:room_amenities_indicies]) 
    if @room.save 

    redirect_to @room 
    else 
    flash.now[:errors] = @room.errors if @room.errors 
    render :new 
    end 
    end 

частные

Защиту room_params params.require (: комната) .permit (: удобства,: удобства_индексы) конец конец

new.html.erb

<label for="room-amenities" class="top">Amenities</label> 
    <ul class="group" id="room-amenities"> 
     <% Room.amenities_list.each_with_index do |amenity, index| %> 
     <li class="checkbox-li"> 
      <input type="checkbox" name="room_amenities_indicies[]" value="<%= index %>"> 
      <%= amenity %> 
      </input> 
     </li> 
     <% end %> 
    </ul><br> 

    <input type="submit" class="button blue input-large label-offset-button" value="Create room"> 
</form> 

index.html.erb

<label for="amenities-tab-button">Amenities</label> 
     <div class="tab-content group"> 
      <% amenities_list = Room.amenities_list %> 
    <ul> 

    <% @room.boolean_array_from_amenities_integer.each_with_index do |amenity_available,index| %> 
     <% if amenity_available %> 
     <li class="available-amenity"> 
     <% else %> 
     <li class="unavailable-amenity"> 
     <% end %> 
      <%= amenities_list[index] %> 
     </li> 
    <% end %> 
    </ul> 

    </div> 
+0

вы можете разместить всю трассировку стеки ошибки? – tagCincy

ответ

0

есть синтаксическая ошибка в контроллере

вы забыли закрыть индекс метод с «концом»

def index 
    @room = Room.all 
    end 

    def show 
    @room = Room.find(params[:id]) 
    end 

Edited

Список просмотра используется @room переменной, которая массив вычисленный из индекса действия, вам необходимо получить экземпляр номера модели.

@room = Room.all

+0

извините, что я положил конец, но не поместил его там, вот и все. – achilles77

+0

Отредактирован ответ. В представлении индекса вы используете переменную @room, которая является массивом и вычисляется из действия индекса, вы ожидаете, что это экземпляр модели комнаты. –

0

Это часто хорошо следовать именования (и другие) конвенции.

Что у вас есть на ваш взгляд, это попытка извлечь в boolean_array из массива номеров экземпляров, когда ваше намерение извлечь его из каждого экземпляра.

В контроллере:

def index 
    @rooms = Room.all # <=== use the plural 
end 

И в индексном:

<% @rooms.each do |room| %> 
    ... 
    <% room.boolean_array_from_amenities_integer.each_with_index do |amenity_available,index| %> 
    ... 
    <% end %> 
    ... 
<% end %> 
+0

У меня есть неопределенный метод 'each 'for nil: NilClass – achilles77

+0

Вы используете @ room ** s ** каждый? – roob

+0

да, я не уверен, что проблема – achilles77

0

Вы должны сделать amenities_list постоянной на модели:

AMENITIES_LIST = ["Smoking Allowed", 
    "Pets Allowed", 
    "TV", 
    "Cable TV", 
    "Internet", 
    "Wireless Internet", 
    "Air Conditioning", 
    "Heating", 
    "Elevator in Building", 
    "Handicap Accessible", 
    "Pool", 
    "Kitchen", 
    "Free parking on premise", 
    "Doorman", 
    "Gym", 
    "Hot Tub", 
    "Indoor Fireplace", 
    "Buzzer/Wireless Intercom", 
    "Breakfast", 
    "Family/Kid Friendly", 
    "Suitable for Events", 
    "Washer", 
    "Dryer"] 

Вы можете назвать его в представлении или контроллере с Room::AMENITIES_LIST

Не уверен, что вы пытаетесь сделать здесь:

def boolean_array_from_amenities_integer 
    [].tap do |amenities_list| 
     Room.amenities_list.length do |order| 
      amenities_list << (self.amenities & 2 ** order > 0) 
     end 
    end 
end