用于创建嵌套资源实例的表格

问题描述

| 如何在父模型之外创建关联的模型实例? 我有一个嵌套资源
# 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
所包含的
SessionsHelper
模块中
# views/messages/new
= form_for current_user.messages.build do |f|
视图中的这一行显示错误
undefined method \'messages_path\' for #<#<Class:0xHex_Number>:0xHex_Number
这个想法是允许用户在他们之间发送消息。     

解决方法

我通过在视图中构建占位符消息解决了视图层错误。
= form_for current_user.messages.build,:url new_user_message_path(:user_id => current_user do |f|
这样就可以呈现表单,但是当我提交表单时,浏览器向
new
操作发送了POST请求。控制台日志读取...
Started POST \"/users/1/messages/new\" for 127.0.0.1 at ...

ActionController::RoutingError (No route matches \"/users/1/messages/new\"):
...这显然是错误的。根据REST理论,接收get请求的函数不应响应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 \"/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
...符合预期