создание структуры каталогов (с вложенными маршрутами красивые URL-адреса, …)

#ruby-on-rails #routing #friendly-url

#ruby-on-rails #маршруты #дружественный-url

Вопрос:

Я работаю над прототипом (rails 2.2.2), чтобы создать аналогичную структуру страниц в качестве бизнес-каталога из http://www.redbeacon.com/s/b /.

Целью должно быть наличие следующих путей: mysite.com/d/state/location / …который отображает индекс чего-либо. До сих пор я делал следующее…

Контроллеры и модели:

 $ ruby script/generate controller Directories index show
$ ruby script/generate controller States index show
$ ruby script/generate controller Locations index show
$ ruby script/generate model State name:string abbreviation:string
$ ruby script/generate model Location name:string code:string state_id:integer
$ rake db:migrate
  

маршруты:

 map.states '/d', :controller => 'states', :action => 'index'
map.locations '/d/:state', :controller => 'locations', :action => 'index'
map.directories '/d/:state/:location', :controller => 'directories', :action => 'index'
  

… встроенные в модели отношения:

 class State < ActiveRecord::Base
  has_many :locations
end

class Location < ActiveRecord::Base
  belongs_to :states
end
  

… добавлены действия для контроллеров:

 class StatesController < ApplicationController
  def index
    @all_states = State.find(:all)
  end
end

class LocationsController < ApplicationController
 def index
    @all_locations = Location.find(:all)
    @location = Location.find_by_id(params[:id])
  end
end

class DirectoriesController < ApplicationController
  def index
    @location = Location.find_by_id(params[:id])
    @all_tradesmen = User.find(:all)
  end
end
  

Представление индекса состояний

 <h1>States#index</h1>
<p>Find me in app/views/states/index.html.erb</p>
<br><br>
<% for state in @all_states %>
  <%= link_to state.name, locations_path(state.abbreviation.downcase) %>
<% end %>
  

Представление индекса местоположений

 <h1>Locations#index</h1>
<p>Find me in app/views/locations/index.html.erb</p>
<br><br>

<% for location in @all_locations %>
  <%= link_to location.name, directories_path(location.state.abbreviation, location.name) %>
<% end %>
  

Но я застрял, я получаю следующее сообщение об ошибке:

 NoMethodError in Locations#index

Showing app/views/locations/index.html.erb where line #6 raised:

undefined method `state' for #<Location:0x104725920>

Extracted source (around line #6):

3: <br><br>
4: 
5: <% for location in @all_locations %>
6:   <%= link_to location.name, directories_path(location.state.abbreviation, location.name) %>
7: <% end %>
  

Есть идеи, почему появляется это сообщение об ошибке? Или вообще какие-либо идеи для лучшего подхода?

Комментарии:

1. Я знаю, что это имеет непосредственное отношение к вашему вопросу, но я бы действительно не советовал использовать Rails старше 2.2.2, у вас есть другой выбор. Если вы создаете прототип этого, похоже, вы начинаете с нуля. Если серия 3.0 все еще слишком нова для вас, я бы, по крайней мере, попытался перейти на 2.3.11.

2. Это существующая система… но мне нужно будет перейти на rails 3 рано или поздно, это точно.

Ответ №1:

Часть кода, на которую вы должны обратить внимание, это:

 class Location < ActiveRecord::Base
  belongs_to :states
end
  

и это должно быть

 class Location < ActiveRecord::Base
  belongs_to :state
end
  

Еще одно замечание, хотя и не связанное с ошибкой, которую вы получаете, программисты Ruby обычно предпочитают array.each than for item in array .