【问题标题】:Wrong url with parameterize带有参数化的错误 url
【发布时间】:2013-03-25 14:03:39
【问题描述】:

我正在尝试使用参数化重写 URL,如下所述:How do I rewrite URL's based on title?

这是我的模型:

class Article < ActiveRecord::Base
  belongs_to :category

  self.per_page = 5

  def to_param
    "#{title.parameterize}"
  end
end

还有我的链接:

<%= link_to(article.title, blog_article_path(article), {:class => "blog_title"}) %>

问题是我没有像/blog/article/"my-article-title" 这样的链接,但我有/blog/article."my-article-title",这是错误的,没有被解释。

你知道原因吗?

我的路线.rb:

get "blog/index"
get "blog/category"
get "blog/article" (I don't use the show action of my article controller, is it the reason ?)

resources :categories

resources :articles

谢谢

【问题讨论】:

  • 你能把你的routes.rb文件的相关部分贴出来吗?

标签: ruby-on-rails url-rewriting parameterized


【解决方案1】:

通过传入资源来使用link_to 的方式只有在您实际使用路由文件中的资源时才真正有效。

这是使用非资源路由和由资源生成的路由的区别(rake 路由输出):

blog_article GET    /blog/article(.:format)

article GET    /articles/:id(.:format)

当你使用article_path(@article) 时,它会用资源的id 填写:id

我建议您使用文章控制器的显示操作,这样您就可以拥有/blog/articles/:id,或者如果您真的想要该路由,您可以这样做:

get "blog/article/:id" => "articles#show", :as => 'blog_article'

变成:

blog_article GET    /blog/article/:id(.:format)

official guides 对此有一些很好的信息。

【讨论】:

  • 那是因为 find 将始终按其 ID 列搜索记录。本质上它只是做"my-article-title".to_i,在这种情况下评估为0。有 2 个选项,使用“#{id}-title.parameterize”,这样它会生成像 /articles/1-my-title 这样的 url(在执行 .to_i 时,它会找到记录 id 1),或者使用另一列来查找文章。我建议看看这个 railscast:railscasts.com/episodes/63-model-name-in-url-revised
猜你喜欢
  • 2018-08-05
  • 2014-08-15
  • 1970-01-01
  • 1970-01-01
  • 2018-04-23
  • 1970-01-01
  • 1970-01-01
  • 2017-03-22
  • 1970-01-01
相关资源
最近更新 更多