2013-02-12 3 views
0

В Rails, когда мне нужно:Как распределить действие контроллера для вложенных маршрутов в Rails?

/comments 

и

/posts/1/comments 

Как лучше организовать CommentsController? Например. пусть маршруты разделяют действия индекса или работают с двумя контроллерами?

+0

Хм .. извините, этот вопрос был плохо сформулирован. Моя проблема в том, что если @post не найден, \ @comments будет пустым, но ответ (200 OK). Однако мне понадобится 404 (не найден), если \ @post пуст. Как поделиться этим действием в контроллере? – poseid

+1

В коде, который я вам дал, я думал, что если \ @post не будет найден, у вас появятся все комментарии из всех сообщений в \ @comments, а не в том, что он будет пустым ... Но вы можете поднять 404 в этом случае, если хотите, проверьте это: http://stackoverflow.com/questions/2385799/how-to-redirect-to-a-404-in-rails – siekfried

ответ

4

Вы можете работать только с одним контроллером.

Я бы с before_filter, чтобы проверить, если post_id пары присутствуют:

class CommentsController < ApplicationController 
    before_filter :find_post, only: [:index] 

    def index 
    if @post.present? 
     ## Some stuff 
    else 
     ## Other stuff 
    end 
    end 

    private 

    def find_post 
     @post = Post.find(params[:post_id]) unless params[:post_id].nil? 
    end 
end 

И в ваших маршрутах (с ограничениями по вашему выбору):

resources :posts do 
    resources :comments 
end 
resources :comments 
1

Я считаю, что вы хотите /comments только для show и index действия, не так ли? В противном случае параметры post будут потеряны при создании или обновлении comment.

В вашей routes.rb вы можете иметь что-то вроде:

resources : posts do 
    resources :comments 
end 
resources :comments, :only => [:index, :show] 

В вашей форме:

form_for([@post, @comment]) do |f| 

И в контроллере, убедитесь, что вы нашли post, прежде чем дело с comments (для new , edit, create и update, таких как:

@post = Post.find(params[:post_id]) 
@comment = @post... 
+0

спасибо. Итак, я понимаю части маршрутов, которые я думаю, но я не уверен в этом: «в вашем контроллере убедитесь, что вы всегда находите сообщение, прежде чем иметь дело с комментариями», то есть, если @ post.present ?; @ post.comments; еще; Comment.all; конец ? Я просто не уверен, что мне лучше вернуться [] для комментариев, когда @post - это нуль. Хм .. это имеет смысл? благодаря! – poseid

+0

В одном посте есть много комментариев, поэтому URL-адрес для создания и редактирования должен иметь полный путь '/ posts/1/comments', иначе комментарий не будет связан с сообщением. По этой причине вы должны найти сообщение, которое получит комментарий: '@post = Post.find (params [: post_id])' – gabrielhilal

0

Вы можете сделать почти все, что вы хотите, с маршрутами рельсов.

routes.rb

match 'posts/:id/comments', :controller => 'posts', :action => 'comments'} 

resources :posts do 

    member do 
    get "comments" 
    end 
end 
Смежные вопросы