Как я могу добавить один объект на макет других объектов в ruby ​​на рельсах? - PullRequest
0 голосов
/ 24 февраля 2012

Здравствуйте, у меня есть 2 объекта: одни события и другие категории.Я хочу поместить категории в макет событий.я пытался, но я получаю сообщение об ошибке

Showing layouts/events.html.erb where line #40 raised:

You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.each
  <% for category in @categories %>
      <li><a href="categories/<%=h category.id %>"><%=h category.name %></a>
      <ul>
        <% for subcategory in @subcategories %>
        <% if subcategory.category_id == category.id %>
          <li><a href="/index/category/<%=h subcategory.id %>"><%=h subcategory.name %></a></li>
      <% end %>
      <% end %>
      </ul>
      </li>
      <% end %>

events_controller

  def index
    @subcategories = Subcategory.find(:all, :order=>"category_id , name")
    @categories = Category.find(:all)
    @events = Event.find(:all)

    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @events }
    end
  end

class Subcategory < ActiveRecord::Base
belongs_to:category
has_many:events
end

class Event < ActiveRecord::Base
    belongs_to:subcategory
end

class Category < ActiveRecord::Base
    has_many:subcategories
end

мои маршруты

  map.root :controller => 'events'
    # Index
  map.connect '/index/', :controller=>'events', :action=>'index'
  map.connect '/index/events/', :controller=>'events', :action=>'index'
  map.connect '/index/category/:id', :controller=>'events', :action=>'showallcategoryposts'
  # Admin
  map.connect '/admin/', :controller=>'events', :action=>'adminindex'
  map.connect '/admin/events/new', :controller=>'events', :action=>'new'
  map.connect '/admin/category/', :controller=>'subcategories', :action=>'index'
  map.connect ':controller/:action/:id'
  map.connect ':controller/:action/:id.:format'

Iя использую Instant Rails 2.0, как я могу исправить свой код, чтобы он работал?

Спасибо

Ответы [ 3 ]

1 голос
/ 24 февраля 2012

Помимо любой проблемы, которая у вас есть ... ИМХО, код выглядит довольно компрометирующим.

Ниже приведены вещи, которые не следует делать такими, какими они являются в настоящее время:

  1. Создание URL-адресов вручную, например, href = "/ index / category / <% = h subcategory.id%>" Но я не могу много сказать об этом, чтобы исправить это, не зная, в какой версии Rails вы находитесь, и не видя вашего routes.rb
  2. Неверный код контроллера
  3. Код модели также нуждается в улучшении

Модели должны выглядеть так:

class Subcategory < ActiveRecord::Base    
  belongs_to :category
  has_many :events, :order => "created_at desc"    
end

class Event < ActiveRecord::Base    
  belongs_to :subcategory    
end


class Category < ActiveRecord::Base    
  has_many :subcategories, :order => "name"    
end

EventsController должен быть таким:

def index
  @categories = Category.all(:order => "name", :include => {:subcategories => [:events]})

  respond_to do |format|
    format.html # index.html.erb
    format.xml  { render :xml => @categories }
  end
end

И ваш взгляд должен выглядеть так:

<% unless @categories.empty? %>

  <% @categories.each do |category| %>
  <li>
    <a href="categories/<%= category.id %>"><%=h category.name %></a>
    <ul>
      <% category.subcategories.each do |subcategory| %>
        <li>
          <a href="/index/category/<%=h subcategory.id %>"><%=h subcategory.name %></a>
        </li>
      <% end %>
    </ul>
  </li>
  <% end %>

<% else %>

  Sorry, no events found!

<% end %>

Надеюсь, этот код также исправит ваши ошибки. Пожалуйста, попробуйте.

ПРИМЕЧАНИЕ. В представлениях требуется больше улучшений, в зависимости от вашей версии Rails и вашего rout.rb ... вам следует использовать методы path / url, такие как category_path (category) и т. Д.

0 голосов
/ 24 февраля 2012

Я почти уверен, что EventsController#index рендерит views/events/index.html.erb, а layouts/events.html.erb ничего не знает о @categories, который установлен для использования в упомянутом рендеринге.Где вы визуализируете layouts/events.html.erb?Попробуйте разместить это под определением вашего класса:

layout 'events'

Кроме того, стоит проверить, что @categories находится внутри контроллера с Rails.logger.debug.Там тоже nil? 1012 *

0 голосов
/ 24 февраля 2012

Вы не опубликовали свой код модели. Интересно, пользуетесь ли вы преимуществами ассоциаций ActiveRecord? Если бы вы были, вам бы не нужно ничего больше, чем @events. Вы можете сделать что-то вроде:

<% @events.each do |event| %><br/>
  <% event.categories.each do |category| %>
    stuff
  <% end %>
<% end %>

Проверьте это руководство.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...