Rails 3中的友好URL

时间:2010-11-11 10:02:25

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

我当前的应用使用以下网址:

/ philsturgeon / philsturgeon / trip_slug

我的模型中的用户附加了这样的行程:

class Trip < ActiveRecord::Base
    belongs_to :user

    def to_param
        "#{user.username}-#{slug}"
    end
end

现在我被告知to_param看起来很棒。这意味着我可以使用正常的资源链接:

<h4><%= link_to trip.name, trip %></h4>

而不是像这样手动创建字符串:

redirect_to('/' + current_user.username + '/' + @trip.slug)

问题是我给了一个连字符(或短划线)分隔的URL。只要我将URL to_param更改为#{user.username}/#{slug}(注意斜杠而不是短划线),我就会收到错误:

  

ActionController :: RoutingError in   首页#索引

     

显示   /Users/phil/Scripts/ruby/travlr/app/views/home/index.html.erb   第27行提出的地方:

     

没有路线匹配{:action =&gt;“destroy”,   :controller =&gt;“trip”,:id =&gt;#}

     

提取的来源(第27行):

     

24:&lt;%= gravatar trip.user.email,50   %GT; 25:26:27:&lt;%=   link_to trip.name,trip%&gt; 28:   29:30:
  用户:

3 个答案:

答案 0 :(得分:0)

您需要将/转义为%2F。所以你应该......

def to_param
    "#{user.username}%2F#{slug}"
end

答案 1 :(得分:0)

看起来硬编码URI是这种情况下唯一真正的解决方案。工作正常,但不是最好的代码。

感谢那些回答的人,但他们不太正确。

答案 2 :(得分:-1)

这种情况正在发生,因为'/'在引用URL时具有特殊含义。想象一下,您在/ Home / user / my-file中有一个文件,并尝试使用file:// Home / user / my / file

访问它

这基本上就是你要做的。如果你想让'file'在'my'里面,你需要将它存储在那里。对于Rails,您需要制作nested resource