изменить форму маршрутизации - при обновлении отправляет метод #show вместо #update - PullRequest
3 голосов
/ 06 января 2011

У меня есть приложение с тщеславными URL, и я изо всех сил пытался разрешить пользователю обновлять атрибуты. Форма редактирования загружается правильно, но после отправки формы, вместо запуска метода обновления, rails перенаправляется в root. Не совсем уверен, почему это происходит ....

# users_controller
  def edit 
    @user = User.find(params[:id]) 
  end

  def to_param  # overridden
     username.parameterize
  end

  def update 
      @user = User.find(params[:id]) 
      if @user.update_attributes(params[:user]) 
         redirect_to user_url(current_user.username), :flash => { :success => "success" }
      else
        redirect_to user_url(current_user.username), :error => { :error => "shit" }
      end
   end

маршруты * * 1004

resources :users do
     resources :friends
   end

  match '/:username' => 'users#show', :as => "user"

форма

<%= form_for @user do |form| %>  
<%= render 'shared/error_messages', :object => form.object %>
 <div class="form">  
    <p> <%= form.label :description, "Message to friends" %>  <br />  
     <%= form.text_area :description %> </p> 

     <%= form.submit %>  
 </div>  
 <% end %>

dev log

Started GET "/users/1/edit" for 127.0.0.1 at Wed Jan 05 19:07:28 -0500 2011
  Processing by UsersController#edit as HTML
  Parameters: {"id"=>"1"}
  User Load (0.2ms)  SELECT "users".* FROM "users" WHERE ("users"."id" = 1) LIMIT 1
Rendered shared/_error_messages.html.erb (0.6ms)
ApplicationController::current_user
ApplicationController::current_user_session
  CACHE (0.0ms)  SELECT "users".* FROM "users" WHERE ("users"."id" = 1) LIMIT 1
  CACHE (0.0ms)  SELECT "users".* FROM "users" WHERE ("users"."id" = 1) LIMIT 1
ApplicationController::current_user_session
ApplicationController::current_user
ApplicationController::current_user
Rendered users/edit.html.erb within layouts/application (27.6ms)
Completed 200 OK in 53ms (Views: 38.7ms | ActiveRecord: 0.3ms)


    Started POST "/1" for 127.0.0.1 at Wed Jan 05 19:08:06 -0500 2011
      Processing by UsersController#show as HTML
      Parameters: {"commit"=>"Update User", "authenticity_token"=>"OM1lIzizuFCYlxC3XmtmG/btqAsyjekHtqsiwlUDn3M=", "utf8"=>"✓", "username"=>"1", "user"=>{"description"=>"Hello people! Give me your address. Get a postcard."}}
      User Load (0.2ms)  SELECT "users".* FROM "users" WHERE ("users"."username" = '1') LIMIT 1
    Redirected to http://0.0.0.0:3000/
    ApplicationController::current_user
    ApplicationController::current_user_session
      User Load (0.3ms)  SELECT "users".* FROM "users" WHERE ("users"."id" = 1) LIMIT 1
      CACHE (0.0ms)  SELECT "users".* FROM "users" WHERE ("users"."id" = 1) LIMIT 1
    ApplicationController::current_user_session
    Completed 302 Found in 102ms

соответствующие маршруты рейка:

 users GET    /users(.:format)                             {:controller=>"users", :action=>"index"}
                                 POST   /users(.:format)                             {:controller=>"users", :action=>"create"}
                        new_user GET    /users/new(.:format)                         {:controller=>"users", :action=>"new"}
                       edit_user GET    /users/:id/edit(.:format)                    {:controller=>"users", :action=>"edit"}
                            user GET    /users/:id(.:format)                         {:controller=>"users", :action=>"show"}
                                 PUT    /users/:id(.:format)                         {:controller=>"users", :action=>"update"}
                                 DELETE /users/:id(.:format)                         {:controller=>"users", :action=>"destroy"}

Ответы [ 3 ]

2 голосов
/ 06 января 2011

@ Beerlington. Ваш ответ был очень близок и привел меня к поиску решения. Определение метода не делало этого, но то, что делало, определяло действие.

<%= form_for @user, :url => { :action => "update" } do |form| %> 

По какой-то причине это сработало ... Не знаю, почему действие не было определено как обновление.

1 голос
/ 06 января 2011

Посмотрите на сгенерированный HTML для вашей формы. Держу пари, что действие выглядит примерно так:

action="/1"

Итак, когда форма отправлена, ваш файл маршрута показывает

match '/:username' => 'users#show', :as => "user"

и вот куда вы отправляетесь

Started POST "/1" for 127.0.0.1 at Wed Jan 05 19:08:06 -0500 2011
  Processing by UsersController#show as HTML

Я думаю, что form_for использует to_param для генерации действия для формы. Поскольку вы переписали это, вы получаете непреднамеренное поведение.

0 голосов
/ 06 января 2011

Ваш код выглядит нормально для меня, но журнал показывает, что форма не отображает скрытое поле _method, содержащее «put».Это может быть вызвано тем, что помощник form_for не распознает @user как существующую запись.Я понятия не имею, почему это может происходить, но временным решением было бы добавить следующее к вашему помощнику form_for:

:html => { :method => :put}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...