【问题标题】:Generating a full resourceful path giving only the last resource to the routes helper生成一个完整的资源路径,仅将最后一个资源提供给路由助手
【发布时间】:2020-09-09 09:09:54
【问题描述】:

简而言之

# routes.rb
resources :article do
  resources :comments do
    resources :replies
  end
end

我希望reply_path 生成与article_comment_reply_path 相同的路径

更多详情

我想在 URL 中链接一些资源,但我不想每次都将所有这些资源都提供给帮助程序:

article_comment_reply_path(@reply.comment.article, @reply.comment, @reply)
# /articles/:acticle_id/comments/:comment_id/replies/:id

相反,我想做:

reply_path(@reply)
url_for [@reply]
link_to 'View reply', @reply

但这会生成/replies/:id

我确实在控制器级别解决了这个问题,方法是检查是否设置了 :article_id:comment_id,如果没有设置,则将用户重定向到 article_comment_reply_path。但这会导致两个问题:

  • 双重重定向,浪费服务器资源。
  • <a>元素中的href与页面网址不同,因此判断它是否为active链接更麻烦。

有没有办法让 url 助手根据它的父资源生成自定义路径?

【问题讨论】:

标签: ruby-on-rails ruby ruby-on-rails-5 ruby-on-rails-6


【解决方案1】:

我想我在这里找到了你需要的东西: https://api.rubyonrails.org/classes/ActionDispatch/Routing/Mapper/CustomUrls.html#method-i-direct

direct :reply do |reply|
  [ reply.comment.article, reply.article, reply ]
end

direct :edit_reply do |reply|
  [ :edit, reply.comment.article, reply.article, reply ]
end

【讨论】:

  • 好一个!它在使用reply_path 时有效,但在使用edit_reply_path 时它似乎忽略了直接并说这是一个未定义的方法。
  • 只需添加另一个直接助手。
猜你喜欢
  • 2012-02-16
  • 2014-02-02
  • 2015-06-30
  • 1970-01-01
  • 2017-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多