Ruby on rails 如何为这些资源编写路由?

Ruby on rails 如何为这些资源编写路由?,ruby-on-rails,ruby,routing,nested-routes,Ruby On Rails,Ruby,Routing,Nested Routes,对于我的rails应用程序,关联如下: 一个用户有许多书签,属于用户 用户有很多友谊 用户有许多提醒 用户有很多评论 书签有很多注释 注释属于用户,也属于书签 友谊属于用户 提醒属于用户 My routes.rb文件: Rails.application.routes.draw do root 'welcome#index' get 'home', :to => 'home#index' get 'searchApis', :to => 'home#searchAp

对于我的rails应用程序,关联如下:

  • 一个用户有许多书签,属于用户
  • 用户有很多友谊
  • 用户有许多提醒
  • 用户有很多评论
  • 书签有很多注释
  • 注释属于用户,也属于书签
  • 友谊属于用户
  • 提醒属于用户
My routes.rb文件:

Rails.application.routes.draw do

  root 'welcome#index'
  get 'home', :to => 'home#index'
  get 'searchApis', :to => 'home#searchApis'

  devise_for :users, :controllers => { registrations: 'registrations' }

  resources :users, shallow: true do
    resources :bookmarks, except: :new
    resources :friendships, only: [:index, :show, :destroy]
    resources :reminders
  end

  resources :bookmarks, shallow: true do
    resources :comments
  end

end
我把这些路线写对了吗

当我
rake routes
时,我得到了两次
bookmarks#index
,所以我很困惑。其中一个的前缀是
书签
,另一个是
书签
。为什么会这样

根据我的理解,应用程序不需要查看索引中的所有书签,因为它们只对创建它们的用户可见。但是,我希望提醒对用户的朋友可见


如果可能的话,我希望得到清理我路线的建议。我真的怀疑我这样做是否正确。

仅提供:索引、:新建和:创建。所以你得到了两次索引。一次来自用户和其他书签-评论

在文章开头重新阅读你的关联,并且评论同时属于用户和书签时,创建多态关系可能是个好主意

你的模型会有一个粗略的指南

class Comment < ActiveRecord::Base
  belongs_to :messages, polymorphic: true
end

class User < ActiveRecord::Base
  has_many :comments, as: :messages
end

class Bookmark < ActiveRecord::Base
  has_many :comments, as: :messages
否则,运行迁移将列添加到注释模型中。即
rails g migration addmessages注释消息:参考

但是,请确保在
rake db:migrate

我对规范的解释之前,打开名为上述的新迁移文件并添加
polymorphic:true

#config/routes.rb
resources :users, only: [] do #-> show a user's collections (no edit)
   resources :bookmarks, shallow: true, except: [:new, :edit, :update]                 #-> url.com/bookmarks/:id
   resources :comments, :friendships, :reminders, shallow: true, only: [:index, :show] #-> url.com/comments/:id
end

resource :bookmarks, except: :index do #-> url.com/bookmarks/:id
   resources :comments #-> url.com/bookmarks/:bookmark_id/comments/:id -- should be scoped around current_user
end
对于注释控制器,请执行以下操作:

#app/controllers/comments_controller.rb
class CommentsController < ApplicationController
   def new
      @bookmark = Bookmark.find params[:bookmark_id]
      @comment  = @bookmark.comments.new
   end

   def create
      @bookmark     = Bookmark.find params[:bookmark_id]
      @comment      = @bookmark.comments.new bookmark_params
      @comment.user = current_user
      @comment.save
   end
end
当然,这有点像是一个错误(最终会使
应用程序控制器膨胀),但如果在其他控制器中只有模糊的“一次性”操作,则最适合使用上述方法


此外,仅与
小写
一起用于URL-确定所有URL应以小写形式处理:

将方案和主机转换为小写。计划及主办机构 URL的组件不区分大小写。大多数正常化者都会这样做 将它们转换为小写。例子:→


尽管这只适用于域/主机,但它也适用于URL本身。

此外,我觉得用户书签路径和书签路径是多余的,我不知道如何修复它。只要想想你希望书签索引如何显示——你希望它的范围围绕用户书签,还是站点范围内的书签?我投了更高的票,因为我不知道
shallow
只允许
index
/
new
/
create
操作这非常有用。我对这一点相当陌生,所以您对我的应用程序控制器逻辑的重构确实为我清理了一些东西。
#app/controllers/comments_controller.rb
class CommentsController < ApplicationController
   def new
      @bookmark = Bookmark.find params[:bookmark_id]
      @comment  = @bookmark.comments.new
   end

   def create
      @bookmark     = Bookmark.find params[:bookmark_id]
      @comment      = @bookmark.comments.new bookmark_params
      @comment.user = current_user
      @comment.save
   end
end
#config/routes.rb
root                   'application#index'
get 'home',        to: 'application#home'
get 'search_apis', to: 'application#search_apis'