如何使用slug rails为所有视图创建seo url

时间:2015-12-02 12:07:43

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

我正在创建一个应用程序,我只想使用我的应用程序的所有路径应该通过seo URL使用slugs访问。我在我的数据库表中创建了一个slug字段。这是我的迁移文件代码

  class AddSlugToClients < ActiveRecord::Migration
    def change
      add_column :clients, :slug, :string
    end
  end

我已将此代码添加到我的控制器的show方法中 我的控制器的代码是:

def show    
    @client = Client.find_by_slug(params[:id])
end

在我的应用模型中,我添加了此代码

class Client < ActiveRecord::Base
  def slug
    ename.downcase.gsub(" ", "-")  
  end
  validates_presence_of :slug
  def to_param
    slug
  end
end

现在当我创建一个新客户端而不是客户端是由完美的slug创建的。但是当我点击从列表页面到该客户端的显示链接,然后在URL中看到

的错误
clients/%23<Client::ActiveRecord_Relation:0xb59828d4>

现在请帮我创建一个显示页面的seo url,同时从索引视图中单击。当前视图代码:

<% @client.each do |client| %> 
  <tr> 
    <td><%= client.ename %></td> 
    <td><%= link_to 'Show', client_path(@client) %></td> 
    <td><%= link_to 'Edit', edit_client_path(@client) %></td> 
  </tr>
<% end %>

1 个答案:

答案 0 :(得分:1)

你有两个问题。

在您的视图代码中,each阻止了client个参数 - 但在您的网址助手中,您正在通过@client。因此,您需要删除@

您的代码变为:

<% @client.each do |client| %> 
  <tr> 
    <td><%= client.ename %></td> 
    <td><%= link_to 'Show', client_path(client) %></td> 
    <td><%= link_to 'Edit', edit_client_path(client) %></td> 
  </tr>
<% end %>

(另外,由于您调用@client的{​​{1}}变量包含多个记录,因此您应该将其重命名为each - 复数。如果您拒绝,则不会中断#39; t这样做,但这不是好习惯)

您的第二个问题是,在您的模型中,由于您使用@clients方法生成了ename中的slug,因此您实际上不需要slug数据库中的列。您应该删除该列。 slug不是存储在数据库中的值,它只是由slug中的ruby动态生成的,它存储在数据库中。

这种方法还有另一个潜在的问题,即如果ename发生变化,那么slug也会发生变化,这意味着如果有任何外部网页链接到旧slug,它们将不再起作用。但这可能不值得进入这里。

相关问题