Я решил ошибку слоя представления, построив сообщение-заполнитель в представлении.
= 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
... как и ожидалось.