首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在polymorphic_path中使用插件

在polymorphic_path中使用插件
EN

Stack Overflow用户
提问于 2013-02-27 06:28:57
回答 2查看 476关注 0票数 1

有没有一种方法可以在polymorphic_path中使用参数来传递slug?

例如,我有以下路由

routes.rb

代码语言:javascript
复制
MyApp::Application.routes.draw do

  match "movies/:slug" => 'movies#show', :as=>:movie
  match "series/:slug" => 'series#show', :as=>:series

end

我有以下模型:

Movie.rb

代码语言:javascript
复制
class Movie < ActiveRecord::Base
    has_many :cast_members, :as=>:media_item
end

Series.rb

代码语言:javascript
复制
class Series < ActiveRecord::Base
    has_many :cast_members, :as=>:media_item
end

CastMember.rb

代码语言:javascript
复制
class CastMember < ActiveRecord::Base
  belongs_to :media_item, :polymorphic=>true
end

这很好用,我可以从演员中引用我的电影,反之亦然,就像正常的has_many/ movie _to关系一样。我也可以在我的cast_member视图中做到这一点:

*cast_members/show.html.erb*

代码语言:javascript
复制
link_to (@cast_member.movie.title, movie_path(@cast_member.movie.slug))

它返回“电影/电影标题”

我也能做到

*cast_members/show.html.erb*

代码语言:javascript
复制
link_to (@cast_member.movie.title, polymorphic_path(@cast_member.media_item))

但是这会返回"/movies/24“

我尝试过以不同的方式将插件作为项传递给polymorphic_path,例如

代码语言:javascript
复制
link_to (@cast_member.movie.title, polymorphic_path(@cast_member.media_item, @cast_member.media_item.slug))
link_to (@cast_member.movie.title, polymorphic_path(@cast_member.media_item, :slug=>@cast_member.media_item.slug))
link_to ([@cast_member.movie.title, polymorphic_path(@cast_member.media_item, @cast_member.media_item.slug]))

但这些都返回错误或带有id的路径。

如何让polymorphic_path使用movie.slug而不是id?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-28 04:07:46

我切换到使用friendly_id来生成插件。它神奇地在后台处理所有slug<->id转换,并解决了这个问题。

我确实认为rails应该有一种内置的方法来实现这一点,就像您可以将插件传递到默认的*_path方法中一样。

票数 1
EN

Stack Overflow用户

发布于 2018-06-26 04:02:22

我通过使用Rails内置的路径帮助器而不是polymorphic_path解决了这个问题。我真的很想使用这种方法,因为它需要使用模型的ID,所以我不能。

在我的应用程序中,我有很多" slugable“的模型,所以在slugable mixin中包含一个#to_path方法是有意义的。

代码语言:javascript
复制
# app/models/concerns/slugable.rb
module Slugable
  extend ActiveSupport::Concern

  included do
    validates :slug, presence: true, uniqueness: {case_sensitive: false}
  end

  def to_path
    path_method = "#{ActiveModel::Naming.singular_route_key(self)}_path"
    Rails.application.routes.url_helpers.send(path_method, slug)
  end

  def slug=(value)
    self[:slug] = value.blank? ? nil : value.parameterize
  end
end

然后在模板中:

代码语言:javascript
复制
<%= link_to my_slugable_model.name, my_slugable_model.to_path %>

如果您的路由中有嵌套资源,则需要调整该资源的代码。

类似于以下内容(未经测试):

代码语言:javascript
复制
def to path(my_has_many_model_instance)
   class_path = self.class.to_s.underscore
   has_many_class_path = my_has_many_model_instance.class.to_s.underscore
   path_method = "#{self_path}_#{has_many_class_path}_path"
   Rails.application.routes.url_helpers.send(path_method, slug, my_has_many_model)
end

祝好运!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15100651

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档