2010-11-29 5 views
0

메시지 컨트롤러를 채널 컨트롤러에 중첩하려고합니다. 내 메시지에 갈 때 내가중첩 리소스

class MessagesController < ApplicationController 

    def index 
    @channel = Channel.find(params[:channel_id]) 
    @messages = @channel.messages 
    end 

    def new 
    @channel = Channel.find(params[:channel_id]) 
    @message = @channel.messages.build 
    end 

    def create 
    @channel = Channel.find(params[:channel_id]) 
    @message = @channel.messages.build(params[:message]) 
    if @message.save 
     flash[:notice] = "Successfully created message." 
     redirect_to channel_url(@message.channel_id) 
    else 
     render :action => 'new' 
    end 
    end 

    def edit 
    @message = Message.find(params[:id]) 
    end 

    def update 
    @message = Message.find(params[:id]) 
    if @message.update_attributes(params[:message]) 
     flash[:notice] = "Successfully updated message." 
     redirect_to channel_url(@message.channel_id) 
    else 
     render :action => 'edit' 
    end 
    end 

    def destroy 
    @message = Message.find(params[:id]) 
    @message.destroy 
    flash[:notice] = "Successfully destroyed message." 
    redirect_to channel_url(@message.channel_id) 
    end 
end 

채널 컨트롤러

class ChannelsController < ApplicationController 

    def index 
    @channels = Channel.find(:all) 
    end 

    def show 
    @channel = Channel.find(params[:id]) 
    @message = Message.new(:channel => @channel) 
    end 

    def new 
    @channel = Channel.new 
    end 

    def create 
    @channel = Channel.new(params[:channel]) 
    if @channel.save 
     flash[:notice] = "Successfully created channel." 
     redirect_to @channel 
    else 
     render :action => 'new' 
    end 
    end 

    def edit 
    @channel = Channel.find(params[:id]) 
    end 

    def update 
    @channel = Channel.find(params[:id]) 
    if @channel.update_attributes(params[:channel]) 
     flash[:notice] = "Successfully updated channel." 
     redirect_to @channel 
    else 
     render :action => 'edit' 
    end 
    end 

    def destroy 
    @channel = Channel.find(params[:id]) 
    @channel.destroy 
    flash[:notice] = "Successfully destroyed channel." 
    redirect_to channels_url 
    end 
end 

routes.rb

SeniorProject::Application.routes.draw do 

    resources :users 
    resources :channels, :shallow => true do |channels| 
    channels.resources :messages 
    end 

    root :channels 

    resources :users, :user_sessions 

    match 'login' => 'user_sessions#new', :as => :login 
    match 'logout' => 'user_sessions#destroy', :as => :logout 
    match ':controller(/:action(/:id(.:format)))' 

"아니오 ID로 채널을 찾을 수 없습니다"라는 오류를 얻을보기
+0

메시지보기로 이동할 때 어떤 URL을 사용합니까? –

+0

localhost/messages –

답변

2

여기에있는 내용은 다음과 같습니다.

@channel = Channel.find(params[:channel_id]) 

params 해시에 channel_id가 정의되어 있지 않으므로 넘어지고 있습니다. 아마 당신의 URI를 의미 같이 보이는, 당신은 얕은 경로를 사용하고 참조 :

/messages 

그리고 당신처럼 보이게해야합니다

:

/channels/1/messages 

이 될 URL을 변경 시도

channel_messages_url(@channel) 

대신

messages_url 

이것은 guess btw입니다. routes.rb을 정의한 방식 때문일 수 있습니다. 메시지 경로를 두 번 정의 했으므로 조금 이상하게 보입니다. 한 번만 has_many로 다시 한 번 적절한 리소스로 정의했기 때문입니다. 아마도 다음과 같은 것을 원할 것입니다 :

# assuming you need shallow routes 
resources :channels, :shallow => true do |channels| 
    channels.resources :messages 
end 
+0

고맙습니다. 고맙습니다. 집에 돌아 오면 다시 시도해 보겠습니다. –

+0

레일을 사용하는 방법을 알아 냈습니다. 2.2 레일을 사용하고 있다고 믿습니다. 3. 자원을 사용해야했습니다. 채널을 수행 리소스 : 메시지 끝 –

관련 문제