2015-12-02 32 views
0

我正在创建一个应用程序,我只想使用我所有应用程序的路线都应该通过seo网址使用slug访问。我在我的数据库表中创建了一个slug字段。这是我的迁移文件中的代码如何使用slug导轨为所有视图创建seo网址

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

我加入这个代码到我的控制器的显示方法 我控制器的代码是:

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 

现在,当我创建一个新的客户端比客户端由完美的slu created创建。但是当我点击链接显示在列表网页,客户端然后让在网址的错误,它看起来像

clients/%23<Client::ActiveRecord_Relation:0xb59828d4> 

现在请大家帮我,而从索引视图中单击创建显示页面的SEO链接。当前查看代码:

<% @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 %> 
+0

试试这个宝石https://github.com/norman/friendly_id – Saqib

+0

你有没有想法做到这一点,没有任何宝石。 –

+0

请张贴您的索引页面代码。 –

回答

1

你有两个问题。

在您的查看代码中,您的each块需要client参数 - 但在您的url助手中,您正在通过@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 %> 

(顺便说一句,因为您在包含多个记录拨打each@client变量,你应该将其重命名@clients - 复数如果你不这样做没有什么会打破。做到这一点,但它不是好的做法)

你第二个问题是,在你的模型,因为你有一个slug方法,从为ename产生的废料,你实际上并不需要有一个您的数据库中有10列。您应该删除该列。 slug不是存储在数据库中的值,它只是由存储在数据库中的ename的ruby动态生成的。

这种方法还有另外一个潜在的问题,就是如果珐琅改变了,那么slu so也是如此,这意味着如果有任何外部网页链接到旧的slu,,他们将不再工作。但这可能不值得进入这里。

+0

我为我工作。谢谢你,先生。 –

+0

但我试图从数据库中删除slug列,但它不工作。获取错误,未定义的方法“find_by_slug” –