0

resources :tags在我的routes.rb.

所以当我去的时候/tags/ios,它向我展示了正确的Tag#Show观点。

我想要发生的是当用户转到/tags/ios它时将其显示为/ios,同样我希望生成的路径始终是/ios(而不是领先的/tags)。

这是我如何在each块中呈现该链接的示例:

<%= link_to "#{tag.name}", url_for(tag) %>
4

3 回答 3

0

那么这里的问题是命名空间

如果你定义一个像

得到 "/(:slug)" => "标签#show"

这将基本上匹配任何其有效标签与否的东西。我会这样做的方式是

在您的路线文件中:

  begin  
    Tag.all.each do |t|
      begin
        get "#{t.slug}" => "Tags#show"
      rescue
      end
    end
  rescue
  end

然后在您的标签控制器中,您可以

 def show
    slug = request.env['PATH_INFO']
    @tag = Tag.find_by_slug(slug)
  end

我的答案来自我写的另一个答案,您可能会感兴趣How to create app-wide slug routing for Rails app?

于 2013-03-29T20:08:22.220 回答
0

在你的 routes.rb

resources :tags
match '/:tag_name' => 'tags#show'

然后在您的 tags_controller#show 操作中,您可以通过以下方式访问标签名称:

params[:tag_name]

请务必将其放在您的路线文件的末尾,因为它会捕获所有内容。此外,由于它会捕获所有内容,因此如果它不是有效的标签名称,您应该呈现 404:

def show
    unless @tag = Tag.where(name: params[:tag_name]).first
        raise ActionController::RoutingError.new('Not Found')
    end
end

要将 /tags/ruby 重定向到 /ruby:

match "/tags/:tag_name" => redirect("/%{tag_name}")

http://guides.rubyonrails.org/routing.html

于 2013-03-29T20:11:10.757 回答
0

所以即使我从这些人那里得到了很多很好的建议,我还是找到了我认为对我来说最好的解决方案。

我所要做的基本上就是在所有标签的链接上的实际 URL 和 URL 栏中都/tags/ruby呈现为。/ruby

我不想做任何会增加我的应用程序负载的事情。

这是对我有用的解决方案:

resources :tags, path: "", except: [:index, :new, :create]

使用path:,您可以指定要显示的路径。即你想在你的资源之前出现什么。因此,如果您希望您的 URL 看起来像myhotness/tags/ruby,那么您只需这样做path: "myhotness"

我不想在我的路上有任何东西,所以我把它留空了。

对于它的价值,您甚至可以向该路线添加约束,如下所示:

resources :tags, path: "", except: [:index, :new, :create], constraints: { :id => /.*/ }
于 2013-03-29T22:51:43.413 回答