2010-11-29 16 views
0

Ich versuche, meine Nachrichten-Controller in meine Kanäle Controller zu nisten. Aber wenn ich meine Nachrichten gehen sehe ich den Fehler "ohne ID nicht Kanal finden konnten"Nesting Ressource

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 

Kanäle Controller

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)))' 

Ende

+0

Wenn Sie in die Nachrichtenansicht gehen, welche URL gehen Sie? –

+0

localhost/messages –

Antwort

2

Was hier los ist, dass diese Zeile:

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

Ist umfallen, weil es in den params-Hash nicht definiert channel_id ist. Ich sehe, Sie verwenden flache Strecken, was bedeutet, dass Ihr uri sieht wohl so aus:

/messages 

Und Sie müssen es wie folgt aussehen:

/channels/1/messages 

Versuchen Sie Ihre URL zu ändern sein:

channel_messages_url(@channel) 

statt

messages_url 

Dies ist übrigens eine Vermutung, es könnte wegen der Art und Weise, die Sie Ihre routes.rb definiert haben, die ein wenig seltsam aussieht, weil Sie die Nachrichten Routen zweimal sind definiert, einmal mit dem has_many und wieder als richtige Ressource. Sie möchten wahrscheinlich etwas wie:

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

Danke für die prompte Antwort, die ich versuchen werde, sobald ich nach Hause komme und Postbacks –

+0

Habe ich es den Weg aus u gab mir für Schienen 2.2 war ich glaube, ich bin mit Schienen 3. Also ich Ressourcen zu tun hatte: Kanäle tun Ressourcen: Nachrichten Ende –