在polymorphic_path中使用slug?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (47)

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

routes.rb

MyApp::Application.routes.draw do

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

end

Movie.rb

class Movie < ActiveRecord::Base
    has_many :cast_members, :as=>:media_item
end

Series.rb

class Series < ActiveRecord::Base
    has_many :cast_members, :as=>:media_item
end

CastMember.rb

class CastMember < ActiveRecord::Base
  belongs_to :media_item, :polymorphic=>true
end

这很好,我可以从演员中引用我的电影,反之亦然,就像正常的has_many / belongs_to关系一样。我也可以在我的cast_member视图中执行此操作:

* cast_members / show.html.erb *

link_to (@cast_member.movie.title, movie_path(@cast_member.movie.slug))

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

我可以做

* cast_members / show.html.erb *

link_to (@cast_member.movie.title, polymorphic_path(@cast_member.media_item))

但是这返回“/电影/ 24”

我试过以不同的方式将一个slu as作为一个物品传递给polymorphic_path,就像

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?

提问于
用户回答回答于

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

我认为rails应该有一个烘焙的方式来做到这一点,就像你可以将slug传递给默认的* _path方法一样。

用户回答回答于

在我的应用程序中,我有很多“可摧毁”的模型,因此#to_path在slugable mixin中包含一个方法是有意义的。

# 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 = "#{self.class.to_s.underscore}_path"
    Rails.application.routes.url_helpers.send(path_method, slug)
  end

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

然后在模板中:

<%= link_to my_slugable_model.name, my_slugable_model.to_path %>

如果你的路线中有嵌套资源,那么你需要调整该资源的代码。

像这样(未经测试):

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

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励