2011-05-24 72 views
0

如何在父模型之外创建关联的模型实例?用于创建嵌套资源实例的表格

我有一个嵌套的资源

# config/routes.rb 
resources :users do 
    resources :messages 
end 

# models/user.rb 
has_many :messages 
# some other user model specifications 

# models/messages.rb 
belongs_to :user 

我跟着RailsTutorial.org推出的认证程序;所以我有一个助手称为current_user它返回一个登录的用户,该方法是在包含在ApplicationController

# views/messages/new 
= form_for current_user.messages.build do |f| 

一个SessionsHelper模块此线在视图中吐出的错误

undefined method 'messages_path' for #<#<Class:0xHex_Number>:0xHex_Number 

这个想法是让用户在他们自己之间发送消息。

回答

0

我通过在视图中构建占位符消息来解决视图图层错误。

= form_for current_user.messages.build, :url new_user_message_path(:user_id => current_user do |f| 

这使得要呈现一种形式,但是当我提交表单,浏览器发送一个POST请求new行动。控制台日志读取...

Started POST "https://stackoverflow.com/users/1/messages/new" for 127.0.0.1 at ... 

ActionController::RoutingError (No route matches "https://stackoverflow.com/users/1/messages/new"): 

......这显然是错误的。根据REST理论,接收获取请求的函数不应响应POST请求,即函数应为请求特定的

为了解决这个问题,我改变了以下内容:

# controllers/messages 
    def new 
++ @message = Message.new 
    end 

# views/messages/new 
-- form_for current_user.messages.build, :url new_user_message_path(:user_id => current_user do |f| 
++ form_for [current_user, @message] do |f| 

这样一来,在提交,在创建函数接收POST请求。在控制台中...

Started POST "https://stackoverflow.com/users/1/messages" for 127.0.0.1 at ... 
    Processing by MessagesController#create as HTML 
    Parameters: {"authenticity_token"=>"areallylongstringthatnobodycanguess", "utf8"=>"✓", "message"=>{"title"=>"This is a breakthrough", "recipient"=>"Jamie", "content"=>"can you believe the developers got the messaging system working???"}, "user_id"=>"1"} 
Completed in 5ms 

......如预期的那样。