如何为这些资源编写路线?

时间:2016-01-18 01:14:22

标签: ruby-on-rails ruby routing nested-routes

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

  • 用户有很多书签,属于用户。
  • 用户有很多友谊。
  • 用户有很多提醒。
  • 用户有很多评论。
  • 书签有很多评论。
  • 评论属于某个用户,属于书签。
  • 友谊属于用户。
  • 提醒属于用户

我的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两次,所以我很困惑。其中一个的前缀是bookmark,另一个是bookmarks。为什么会这样?

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

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

2 个答案:

答案 0 :(得分:1)

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

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

粗略指南适用于您的模型,

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 generate migration Comments,请将其显示如下:

class CreateComments < ActiveRecord::Migration
  def change
    create_table :comments do |t|
      t.string :name
      t.references :messages, polymorphic: true, index: true
      t.timestamps null: false
    end
  end
end

否则运行迁移以向Comment模型添加列。我rails g migration AddMessagesToComments messages:references 但请务必打开上面命名的新迁移文件,并在polymorphic: true之前添加rake db:migrate

答案 1 :(得分:1)

我对您的规范的解释:

#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

不要成为welcomehome控制人,你不需要他们。

您可以在application控制器中放置副手:

#config/routes.rb
root                   'application#index'
get 'home',        to: 'application#home'
get 'search_apis', to: 'application#search_apis'

当然这有点像antipattern(你最终会膨胀你的ApplicationController),但是如果你只是模糊不清的话,一次性的#34;在其他控制器中的操作,您最适合使用上述操作。

另外,只有snake_caselowercase一起用于网址 - HTTP's spec确定所有网址都应以小写字母处理:

  

将方案和主机转换为小写。该计划和主持人   URL的组件不区分大小写。大多数规范化器会   将它们转换为小写。示例:→   http://www.example.com/

虽然这仅适用于域/主机,但它也适用于URL本身。