Форма для создания экземпляра вложенного ресурса - PullRequest
0 голосов
/ 24 мая 2011

Как можно создать связанный экземпляр модели вне родительской модели?

У меня есть вложенный ресурс

# 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, который возвращает пользователя, вошедшего в систему. Этот метод находится в модуле SessionsHelper, включенном в ApplicationController

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

.ошибка

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

Идея состоит в том, чтобы позволить пользователям отправлять сообщения между собой.

1 Ответ

0 голосов
/ 25 мая 2011

Я решил ошибку слоя представления, построив сообщение-заполнитель в представлении.

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

Это позволило визуализировать форму, но когда я отправил форму, браузер отправил запрос POST для действия new. Журнал консоли прочитал ...

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|

Таким образом, при отправке функция create получает запрос 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

... как и ожидалось.

...