嵌套资源
问题描述:
我试图将我的消息控制器嵌入到我的通道控制器中。但是,当我去我的邮件查看我的错误 “找不到没有ID通道”嵌套资源
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)))'
末
答
这里发生了什么事是这条线:
@channel = Channel.find(params[:channel_id])
由于params散列中没有定义的channel_id,导致摔倒。我看你用浅浅的路线,这意味着你的URI可能是这样的:
/messages
而你需要它看起来像:
/channels/1/messages
试着改变你的网址是:
而不是channel_messages_url(@channel)
messages_url
这是一个猜测顺便说一句,这可能是因为你已经定义了你的routes.rb
,这看起来有点奇怪,因为你定义了两次消息路由,一次是has_many,一次是适当的资源。你可能想要这样的东西:
# assuming you need shallow routes
resources :channels, :shallow => true do |channels|
channels.resources :messages
end
当你去消息视图,你要去哪个URL? – 2010-11-29 22:14:19
本地主机/消息 – 2010-11-30 02:47:03