问题描述
|
如何在父模型之外创建关联的模型实例?
我有一个嵌套资源
# 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
...符合预期