2011-02-11 7 views
2

余分なパス要素(スラッグ)をRails 3のURLに渡すためのルートを設定する正しい方法は何ですか?私はいくつかのあなたがリソースとしてオブジェクトをリストすると、あなたはショーと新しいものを得ることができます。 Railsは奨励、
http://somewebserver.com/topics/1/learning-rails
しかし/は、パスの区切り文字と見なされているので、私はまだこのよう
http://somewebserver.com/topics/1
及びこれら
http://somewebserver.com/topics/new
http://somewebserver.com/topics/1/editRails 3 Routes - スラッグを可能にする

+0

URLスタブのparamsハッシュでTopicsController#newに派遣されるだろう。小柄な人にしようとするのではなく、人々があなたに正しく質問することを理解するのに役立つかもしれないと考えてください。 –

答えて

0

に動作するようになります。ここ

は一例ですあなたは slugからIDを分離するために、よりニュートラルな -を使用します。

this screencastを参照してください。

それ以外の場合は、:idのカスタム検証を渡して:id/を含めることができますが、これは簡単ではないことをRailsに伝える必要があります。

# lib/topic_slugger.rb 
class TopicSlugger 
    AD_KEY = "action_dispatch.request.path_parameters" 

    def self.call(env) 
    controller = (env["PATH_INFO"].split("/")[1].camelize+"Controller").constantize 
    glob = env[AD_KEY][:glob] 
    slug, action_name = nil 
    if glob 
     path_params = glob.split("/") 
     if path_params.length == 1 
     if ["new","edit"].include?(path_params.first) 
      # no slug present 
      action_name = path_params.first 
     else 
      slug = path_params.first 
     end 
     else 
     action_name = path_params.first 
     slug = path_params.last 
     end 
    end 
    env[AD_KEY][:slug] = slug if slug 
    action = if action_name # "new" or "edit" 
       action_name.to_sym 
      else 
       case env["REQUEST_METHOD"] 
       when "PUT" then :update 
       when "DELETE" then :destroy 
       else :show 
       end 
      end 
    controller.action(action).call(env) 
    end 
end 

# config/routes.rb 
require 'topic_slugger' 

Ztest::Application.routes.draw do 
    # handle show, new, edit, update, destroy 
    match 'topics/:id/*glob' => TopicSlugger 
    # handle index, create 
    resources :topics 
end 

これは、の要求を取る:あなたはこのような何かを行うことができるように

1

それはあなたのナメクジは、「1-学習レール」のように見えるようにするために、おそらくより良いですが、Railsの3以来、今allows the use of Rack applicationsは、ルートを処理します"/topics/1/foo/bar"のフォームを作成し、globに組み合わせアクション/スラグ("new/learning-rails"など)が含まれているか、スラッグ("learning-rails")が含まれているかどうかを判断し、環境の要求パラメータにスラッグを追加してからコントローラの動作は、それ自身がRackアプリケーションです。 "index"と "create"は通常resourcesステートメントで処理されます。

ですから、例えば"GET /topics/1/new/learning-rails"のために、より一般的にレールのコミュニティのURLスラグと呼ばれる{ :id => "1", :slug => "learning-rails, :glob => "new/learning-rails" }

関連する問題