6

RESTfulルーティングを維持しながら、次のようなURLを持つワードプレススラッグに似た何かをしようとしています:

http://foo.com/blog/2009/12/04/article-title

私が RESTFUL ルーティングを維持することに関心があるのは、カスタム ルートを使用しているため、多くのプラグインを使用できないためです。

私はすでにRESTfulな外観を次のようにしています:

map.connect   '/blog/:year/:mon/:day/:slug',
              :controller => 'posts', :action => 'show',
                :year => /\d{4}/, :month => /\d{2}/,
                :day => /\d{2}/, :slug => /.+/,
                :requirements => { :year => /\d{4}/, :month => /\d{2}/, :day => /\d{2}/, :slug => /.+/ }

リンクを作成するには、カスタムの link_to ヘルパーを作成して、適切な URL を生成する必要がありました。私は本当にこれを RESTful にして、link_to post_path( @post ) が上記の URL を生成し、link_to edit_post_path(@post) ...article-title/edit を作成したいと考えています。

私も :has_many => [:comments] を持っていますが、それもうまくいきます。私が試した link_to は次のようになります。

 'posts', :action => 'show', :year => recent_post.datetime.year.to_s,
            :month => sprintf('%.2d', recent_post.datetime.mon.to_i),
            :day => sprintf('%.2d', recent_post.datetime.mday.to_i),
            :slug => recent_post.slug %>

これが得られます(これは私が望むものではありません):

http://foo.com/posts/show?day=30&month=11&slug=welcome-to-support-skydivers&year=2009

何が間違っているのかわかりません。これを達成することさえ可能ですか?

4

2 に答える 2

2

カスタムルートを使用していないため、機能していないと思います。私はいつもこれをしています。簡単なカスタム ルートを設定するだけです。

map.present_page '/blog/:year/:month/:day/:slug',
          :controller => 'posts', :action => 'show'

次に、次のことができるはずです。

present_page_path(:year => 2009, 
                  :month => "December", 
                  :day => "13", 
                  :slug => "just-an-example")

クエリ文字列を取得している理由は、何らかの理由でレールがルートに接続していない可能性が最も高いです。名前付きルートを使用すると、そのルートを使用するようレールに明示的に指示されます。それがあなたのためにそれを解決するかどうか教えてください!

于 2009-12-13T12:23:01.400 に答える
1

これが私がこれについて行った方法です...

まず、ルートで生成されたurlメソッドを使用しようとはしていません。また、日付パラメータのフォーマットをチェックするという点では、あなたと同じ程度には行きません。日付スタンプとURLの作成を自動生成しているので、フォーマットの有効性については気にせず、ActiveSupport::TimeWithZoneオブジェクトをフォーマットしているだけです。

関連するルートから始めましょう:

  map.post_by_date 'content/:year/:month/:day/:slug', 
                  :controller => 'posts',
                  :action     => 'show_by_date_slug'

引数のフォーマットや繰り返しについて心配したくなかったので、ヘルパーメソッドを作成し、関連するコントローラーにヘルパーを含めました。

  def pubdate_slug_url(post)
    year   = post.published_on.strftime('%Y')
    month  = post.published_on.strftime('%m')
    day    = post.published_on.strftime('%d')

    url    = "/" + ["content", year, month, day, post.slug].join("/")

    return url
  end

最後に、私の見解では、Postオブジェクトを渡して、メソッドを呼び出すだけです。

  <h2><%= link_to post.headline, pubdate_slug_url(post) %></h2>

私は次のようなURLになります:http ://wallscorp.us/content/2009/12/06/links

乾杯。

于 2009-12-09T04:41:38.157 に答える