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\-]+/ }

所以我应该在index行动中使用参数,并通过行动中的 slug 来发布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 中通宵搜索所学到的全部内容。

但问题是奇怪的事情不断发生,因为我刚接触 Rails:

  1. 当我去时localhost/,应用程序中断并说它已调用show操作但数据库中的第一个对象已被接收为:年(原文如此!):

    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 中没有日期的 slug 和类似但没有用的问题的解决方案。

4

2 回答 2

5

问题出在 post 的路径助手使用 as 中,因为第一个参数post_path(post)必须是 year,因为我:as => :post在.routes.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_path,如果命名正确的话。posts_year_path("2012")posts_month_path("2012","12")

    我建议不要:as => :post在该匹配中使用,也不要to_param在模型文件中创建,因为它可能会破坏您不期望的东西(active_admin对我而言)。

  2. 控制器文件posts-controller.rb应填写需要提取和检查日期正确性的帖子。尽管如此,在这种状态下它是可以的并且没有破坏任何东西。

  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 回答