2016-01-18 2 views
2

Для моего приложения рельсов ассоциации является следующим:Как написать маршруты для этих ресурсов?

  • Пользователя имеет много закладок и принадлежит пользователю.
  • У пользователя много друзей.
  • У пользователя есть много напоминаний.
  • У пользователя много комментариев.
  • В закладки много комментариев.
  • Комментировать принадлежит пользователю и принадлежит к закладке.
  • Дружба принадлежит пользователю.
  • Напоминание принадлежит пользователю

Мой 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. Почему это происходит?

С моей точки зрения, приложение не обязательно должно видеть все закладки в индексе, потому что они видны только пользователю, который их создал. Тем не менее, я хочу, чтобы напоминания были видны друзьям пользователя.

Я надеюсь получить предложения по очистке маршрутов, если это возможно. Я действительно сомневаюсь, что делаю это правильно.

+0

Кроме того, я чувствую, что user_bookmarks_path и bookmarks_path является избыточным, и я не знаю, как его исправить. –

+0

Просто подумайте о том, как вы хотите, чтобы индекс закладок отображался - вы хотите, чтобы он охватывал закладки * пользователя * или закладки на сайте? –

ответ

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 

Не устанавливайте контроллер welcome или home, лет им они не нужны.

Вы можете поместить действия от рук в вашем application контроллера:

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

Конечно, это несколько из antipattern (вы в конечном итоге вздутие ваш ApplicationController), но если у вас есть только смутное «один -off "в других контроллерах, вам лучше всего подходит, используя приведенное выше.


Кроме того, используйте только snake_case с lowercase для URL, - HTTP's spec определяет все URL-адреса должны быть обработаны в нижнем регистре:

Преобразование схемы и хозяина к нижнему регистру. Схема и хост Компоненты URL-адреса не чувствительны к регистру. Большинство нормализаторов будет конвертировать их в нижний регистр. Пример: → http://www.example.com/

Хотя это только для домена/хоста, это применимо в самом URL, тоже.

+0

было очень полезно. Я довольно новичок в этом, поэтому ваш рефакторинг логики моего контроллера приложений немного меня убирает. –

1

Shallow предоставляет: index,: new и: create only. Таким образом, вы получаете индекс дважды. Один раз из пользователей и других закладок - комментарии.

При повторном ознакомлении со своими ассоциациями в начале вашего сообщения, а также что комментарии принадлежат как пользователям, так и закладам, вероятно, это хорошая идея создать Полиморфные отношения.

Грубое руководство будет для ваших моделей,

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 

иначе запустить миграцию добавьте столбцы в свою модель комментариев. Т.е. rails g migration AddMessagesToComments messages:references Но не забудьте открыть новый файл миграции с именем, как описано выше и добавьте polymorphic: true, прежде чем rake db:migrate

+0

Я поддержал, потому что я не знал, что «мелкие» разрешены только действия 'index' /' new'/'create' –

Смежные вопросы