创建一个目录结构(带有嵌套路由 + 漂亮的 url,...)

Posted

技术标签:

【中文标题】创建一个目录结构(带有嵌套路由 + 漂亮的 url,...)【英文标题】:create a directory structure (with nested routes + pretty urls, ...) 【发布时间】:2011-12-11 06:05:41 【问题描述】:

我正在开发一个原型(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 %>

任何想法为什么会弹出此错误消息?或者一般来说有什么更好的方法的想法?

【问题讨论】:

我知道这与您的问题无关,但我真的建议您不要使用 2.2.2 的 Rails,您还有其他选择。如果您正在对此进行原型设计,那么听起来您是从新开始的。如果3.0系列对你来说还是太新,我至少会尝试去2.3.11。 这是一个现有系统...但我迟早需要升级到 Rails 3,这是肯定的。 【参考方案1】:

你应该看的部分代码是:

class Location < ActiveRecord::Base
  belongs_to :states
end

应该是的

class Location < ActiveRecord::Base
  belongs_to :state
end

另一个注意事项,尽管与您遇到的错误无关,Ruby 程序员通常更喜欢array.each 而不是for item in array

【讨论】:

以上是关于创建一个目录结构(带有嵌套路由 + 漂亮的 url,...)的主要内容,如果未能解决你的问题,请参考以下文章

反应路由器和嵌套路由

带有分页器和文章的嵌套类别的 SEO 路由

如何从 Django 中的 GET 参数创建漂亮的 url?

带有 .htaccess 的漂亮 URL

如何使用 NestJS 创建带参数的嵌套路由

VueRouter 嵌套路由