5

次の機能を備えた blog\news アプリケーションを実装したいと考えています。

  1. ルートのすべての投稿を表示:example.com/
  2. ある年に回答したすべての投稿を表示:example.com/2012/
  3. 特定の年と月に回答するすべての投稿を表示:example.com/2012/07/
  4. 日付とスラッグでいくつかの投稿を表示します。example.com/2012/07/slug-of-the-post

routes.rbだから私はファイルのモックアップを作成しました:

# GET /?page=1
root :to => "posts#index"

match "/posts" => redirect("/")
match "/posts/" => redirect("/")

# Get /posts/2012/?page=1
match "/posts/:year", :to => "posts#index",
  :constraints => { :year => /\d{4}/ }

# Get /posts/2012/07/?page=1
match "/posts/:year/:month", :to => "posts#index",
  :constraints => { :year => /\d{4}/, :month => /\d{1,2}/ }

# Get /posts/2012/07/slug-of-the-post
match "/posts/:year/:month/:slug", :to => "posts#show", :as => :post,
  :constraints => { :year => /\d{4}/, :month => /\d{1,2}/, :slug => /[a-z0-9\-]+/ }

だから私はアクションでparamsを操作し、indexアクションでスラッグごとにポストを取得するshow必要があります(日付が正しいかどうかをチェックすることはオプションです):

# GET /posts?page=1
def index
  #render :text => "posts#index<br/><br/>#{params.to_s}"
  @posts = Post.order('created_at DESC').page(params[:page])
  # sould be more complicated in future
end

# GET /posts/2012/07/19/slug
def show
  #render :text => "posts#show<br/><br/>#{params.to_s}"
  @post = Post.find_by_slug(params[:slug])
end

to_paramまた、モデルに実装する必要があります:

def to_param
  "#{created_at.year}/#{created_at.month}/#{slug}"
end

これは、一晩中 api/guides/SO を検索して学んだことのすべてです。

しかし、問題は、レールを初めて使用する私にとって奇妙なことが起こり続けることです。

  1. に移動するlocalhost/と、アプリが壊れて、showアクションを呼び出したが、データベース内の最初のオブジェクトが :year として受信されたと表示されます (sic!):

    No route matches {:controller=>"posts", :action=>"show", :year=>#<Post id: 12, slug: "*", title: "*", content: "*", created_at: "2012-07-19 15:25:38", updated_at: "2012-07-19 15:25:38">}
    
  2. 私が行くとlocalhost/posts/2012/07/cut-test同じことが起こります:

    No route matches {:controller=>"posts", :action=>"show", :year=>#<Post id: 12, slug: "*", title: "*", content: "*", created_at: "2012-07-19 15:25:38", updated_at: "2012-07-19 15:25:38">}
    

私が作ったことのない非常に簡単なものがあるように感じますが、それが何であるかを見つけることができません。

とにかく、この投稿は解決時に役立ちます。日付のない URL のスラッグだけに対する解決策と、類似しているが有用ではない質問に対する解決策しかないためです。

4

2 に答える 2

5

パラメータ化された一致でpost_path(post)使用するため、最初のパラメータは年でなければならないため、問題はポストのパスヘルパーの使用法 asにありました。:as => :postroutes.rb

それにもかかわらず、ここでソリューション全体を明確にするために、すべてが適切に機能するために必要ないくつかのアクションがあります。

  1. 一致ごとに適切なパス ヘルパー名を追加する必要があります。

    # Get /posts/2012/07/slug-of-the-post
    match "/posts/:year/:month/:slug", <...>,
      :as => :post_date
    

    post_date_path("2012","12","end-of-the-world-is-near")ビューで使用できるようになりました。

    適切に名前が付けられている場合posts_pathposts_year_path("2012")、についても同じです。posts_month_path("2012","12")

    予期しないものを壊す可能性があるため:as => :post、その一致でもモデルファイルの作成でも使用しないことをお勧めします(私に関しては)。to_paramactive_admin

  2. コントローラ ファイルposts-controller.rbは、スラッグの前に抽出と日付の正確性のチェックが必要な投稿で満たされている必要があります。それでもこの状態でOKで、何も壊れません。

  3. モデル ファイルposts.rbには、適切な形式で年と月の抽出物を入力する必要があります。例:

    def year
      created_at.year
    end
    
    def month
      created_at.strftime("%m")
    end
    

    to_param私がすでに気づいたように、本当に必要な方法はありません。

于 2012-07-20T13:40:25.600 に答える
0

これは完全な routes.rb ファイルですか? resources :posts基本的に一致する前のエントリがあるように聞こえ/posts/:idます。また、あなたが投稿したルート ファイルから、ルート パスから投稿へのリダイレクトを引き起こしている可能性があるものは何もないので、そこに別のものがあるはずです。

于 2012-07-20T05:05:41.210 に答える