1

polymorphic_pathのパラメーターを使用して、スラッグを渡す方法はありますか?

たとえば、私は次のルートを持っています

ルート.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」を返します

スラッグをアイテムとして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にidの代わりにmovie.slugを使用させるにはどうすればよいですか?

4

2 に答える 2

1

スラッグを生成するためにfriendly_idを使用するように切り替えました。バックグラウンドですべてのslug<->id変換を魔法のように処理し、問題を解決します。

レールには、これを行うための組み込みの方法が必要だと思います。これは、デフォルトの*_pathメソッドにスラッグを渡すことができるのと同じ方法です。

于 2013-02-27T20:07:45.977 に答える
0

の代わりにRailsの組み込みパスヘルパーを使用してこれを解決しましたpolymorphic_path。モデルのIDを使用する必要があったので、本当にその方法を使いたかったのですが、できませんでした。

私のアプリには「スラッグ可能」なモデルがたくさんあるので#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

幸運を!

于 2018-06-25T20:02:22.363 に答える