link_to用户定义的url

时间:2014-11-09 15:43:57

标签: ruby-on-rails ruby-on-rails-3

我有一个带有以下模型组织的rails应用程序:

广告:

class Ad < ActiveRecord::Base
 belongs_to :area
...

区域:

class Area < ActiveRecord::Base
 has_many :ads
...

我需要做的是,对于每个区域:

  • 显示与此区域相关的所有广告
  • 通过名为www.mywebsite.com/AreaName
  • 的网址生成此内容

我现在拥有的是:

show.html.erb:

<% Area.order(:name).each do |area| %>
  <li><%= link_to area.name, XXXX_path(area_id: area.id) %></li>   
<% end -%>

Routes.rb:

match 'XXXX' => 'ads#index' , :as => :XXXX

但我有两个不好的影响:

  1. 我的XXXX是一个静态字符串,我希望它对每个区域都是动态的
  2. 生成的网址是www.mywebsite.com/XXXX?area_id=25(我想删除?area_id = 25部分)
  3. 有什么建议吗?

    由于

1 个答案:

答案 0 :(得分:1)

首先,你需要slug来在url中使用区域名称。您可以使用FriendlyId来实现此目的。

然后您可以按如下方式定义路线,

get '/:area' => 'ads#index' , :as => :area

但要小心!您必须在routes文件的末尾定义此路由。否则,其他路线可能无法正常工作。

然后您可以使用帮助程序生成URL,

<%= link_to area.name, area_path(area: <slug-column>) %>

建议,

您应该将区域放在/areas段下。这样他们就不会干扰其他路线。

get '/areas/:id' => 'ads#index' , :as => :area

如果您有更多区域/广告路线,则可以使用嵌套的RESTful路线

resources :areas do
  resources :ads
end