有没有办法可以在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))
返回“movie / movie-title”
我能做到
* cast_members / show.html.erb *
link_to (@cast_member.movie.title, polymorphic_path(@cast_member.media_item))
但这会返回“/ movies / 24”
我已尝试以不同的方式将slug作为项目传递给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?
答案 0 :(得分:1)
我切换到使用friendly_id来生成slu ..它神奇地在后台神奇地处理所有slug&lt; - &gt; id转换,并解决问题。
我认为rails应该采用烘焙方式来执行此操作,就像将slug传递给默认的* _path方法一样。
答案 1 :(得分:0)
我通过使用Rails的内置路径助手而不是polymorphic_path
解决了这个问题。我真的很想使用该方法,因为它需要使用模型的ID,所以我不能。
在我的应用中,我有很多“可投放”模型,因此在可投放的mixin中加入#to_path
方法是很有意义的。
# 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
然后在模板中:
<%= 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
祝你好运!