我正在创建一个应用程序,我只想使用我的应用程序的所有路径应该通过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 %>
答案 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,它们将不再起作用。但这可能不值得进入这里。