2013-06-13 2 views
1

Я хочу поддержать:рельсы маршрутизации вложенных ресурсов дублировать

POST images/1/comments/2/like 

и

POST comments/2/like 

Они оба указывают на те же ресурсы с таким же действием. Как я могу это сделать в файле маршрута rails?

resources :images do 
    resources :comments do 
     member do 
     post 'like' 
     end 
    end 
    end 

Это будет работать для

POST images/1/comments/2/like 

, но как я могу также, когда я не указать images/1 часть?

ответ

1

Я хотел бы рассмотреть переделку, которая RESTful маршруты для Comment вы гнездились, а какие нет. Я предполагаю, что ваши модели выглядеть примерно так:

# app/models/image.rb 
class Image < ActiveRecord::Base 
    has_many :comments 
end 

# app/models/comment.rb 
class Comment < ActiveRecord::Base 
    belongs_to :image 
end 

Поскольку ваши Image и Comment модели обладают отношения один-ко-многим, я могу понять, почему вы думаете гнездиться маршрут комментарии ресурсов в пределах изображений один. Однако все действия CRUD в comments_controller.rb, только create фактически требует, чтобы родительский образ ID явно передается в. С точки зрения RESTful, только new и create действия требуют, что image_id передается к действию. Операции edit, update, delete и like могут выполняться независимо от исходного изображения.

Рассмотрим альтернативную схему маршрутизации вместо:

# config/routes.rb 
resources :images do 
    resources :comments, :only => [:index, :new, :create] 
end 

resources :comments, :only => [:show, :edit, :update, :destroy] do 
    member do 
    post 'like' 
    end 
end 

Теперь только комментарий действия , которые явно зависели от родительского ID фактически вложены в пределах изображения маршрутов. Остальные действия комментариев непосредственно направляются в контроллер комментариев, не передавая родительский идентификатор. Ваши маршруты больше не дублируются, и каждое действие будет иметь только один маршрут, объявленный для него.

+0

Благодарим за подробный ответ/объяснение! – 0xSina

+0

Несомненно. Надеюсь, все это имеет смысл. В принципе, обеспечение того, чтобы каждое действие имело только один маршрут, удерживает ваше приложение DRY и не позволяет вам добавить кучу условных выражений для обработки параметров в действиях, которые перенаправляются из нескольких источников. – zeantsoi

+0

Это вроде поздно, но .... распространено ли иметь путь к индексу/новому/созданию ресурсов комментариев, не включая идентификатор изображения, а скорее включать его в параметры? поэтому вместо того, чтобы говорить изображения/1/комментарии, делать комментарии/1? image_id = 5. Какой из них более спокойный? Благодаря! – 0xSina

0

просто добавить resources :images может работать

0

Не уверен, что есть гораздо более красивый способ, чем повторять это ниже:

resources :comments do 
    member do 
    post 'like' 
    end 
end 

Как так:

resources :images do 
    resources :comments do 
    member do 
     post 'like' 
    end 
    end 
end 

resources :comments do 
    member do 
    post 'like' 
    end 
end 
1

Вы можете сделать его более красивым на самом деле. Согласно http://ruby-journal.com/how-to-dry-your-rails-routes/, это также работает:

comments = Proc.new do 
    member do 
    post 'like' 
    end 
end 

resources :comments, &comments 

resources :images do 
    comments.call 
end 

и в Rails 4 вы можете использовать проблемы

concern :comments_concern do 
    member do 
    post 'like' 
    end 
end 

resources :comments, concerns: :comments_concern 

resources :images, concerns: :comments_concern do 
    #do more stuff here 
end 

Я не проверял, но это может помочь. Посмотрите на упомянутый сайт.Удачи

-frbl

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