Friendly_Id:id是slug,但是url仍然显示对象id属性(?id =)

时间:2014-01-23 10:43:11

标签: parameters ruby-on-rails-4 ruby-on-rails-plugins friendly-id

我正在尝试在我的rails 4应用程序中实现Friendly_Id gem并遇到障碍。

宝石正在运作,但网址仍不漂亮。它看起来像这样:

http://www.example.com/project/featured?id=project-name

gem正在运行,因为id参数现在是一个slug,但是我不知道如何删除“?id =”并用斜杠替换它?那可能吗?我错过了一步吗?

控制器:

  def featured
    @project = Project.friendly.find(params[:id])
  end

型号:

  extend FriendlyId
  friendly_id :title, use: :slugged

查看:

     <% @projects.each do |project| %>

        <%= link_to project_featured_path(:id => project.slug) do %>

            <%= project.title %>

        <% end %>

    <% end %>

相关路线:

get "project/featured"

match 'project' => 'project#index', :as => :project, via: [:get, :post]

resources :projects do
  member do
    get :featured
  end
end

match ':controller(/:action(/:id))(.:format)', via: [:get, :post]   

我还引用了我之前在rails 3中运行Friendly_Id的应用程序。它似乎没有这个问题...不记得我是否只是错过了一步。

非常感谢任何帮助。干杯!

更新

替换后:

project_featured_path(:id => project.slug)

pearlshareteam回答:

project_featured_path(project)

我的网址看起来好一点但仍然无法正常工作。它看起来像这样:

http://example.com/project/featured.project-one

有一段时间而不是斜线。在测试中,我发现如果我用斜线替换了点,则实际生成了正确的页面。

我的link_to格式化只是一个问题吗?

1 个答案:

答案 0 :(得分:0)

答案取决于您的路线,因此发布它们可能也很方便,但如果它们看起来像这样:

resources :projects do
  member do
    get :featured
  end
end

我猜你想要的语法是:

project_featured_path(project)

我签出了friendly_id source,似乎friendly_id会覆盖活动记录'to_param'方法。这是由rails path / url helpers调用来从AR对象构造url所以将使用url slug构造url。

另请参阅source中的finder方法,其中看起来友好ID会覆盖'find'方法。它首先寻找一个友好的ID,如果失败,它会回归到传统的id。

我认为这应该有助于或有希望成为正确方向的暗示。