Ruby on rails 编辑表单发送-在更新提交运行时#显示方法而不是#更新

Ruby on rails 编辑表单发送-在更新提交运行时#显示方法而不是#更新,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,我有一个带有虚荣URL的应用程序,我一直在努力允许用户更新属性。编辑表单正在正确加载,但在表单提交后,rails会重新路由到root,而不是运行update方法。不太清楚为什么会发生这种情况 # users_controller def edit @user = User.find(params[:id]) end def to_param # overridden username.parameterize end def update

我有一个带有虚荣URL的应用程序,我一直在努力允许用户更新属性。编辑表单正在正确加载,但在表单提交后,rails会重新路由到root,而不是运行update方法。不太清楚为什么会发生这种情况

# 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
路线

resources :users do
     resources :friends
   end

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

相关rake路线:

 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"}

我觉得您的代码看起来不错,但是日志显示表单没有呈现包含“put”的隐藏
\u方法
字段。这可能是由于helper的表单_未将@user识别为现有记录造成的。我不知道为什么会发生这种情况,但暂时的解决办法是将以下内容添加到您的帮助者表单中:

:html => { :method => :put}

@比灵顿。你的回答非常接近,让我找到了解决办法。定义方法并没有做到这一点,但所做的是定义动作

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

出于某种原因,这就成功了。。。不确定为什么操作未定义为更新

查看表单生成的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为表单生成操作。由于您写得太多,您会出现意外行为。

在应用程序目录中运行“rake routes”,并将输出添加到您的问题中。为什么您的控制器中有to_param方法?添加了rake routes。to_param方法使用户名替换id。请参阅这是ActiveRecord功能,属于用户模型,而不是控制器。感谢对to_param的说明。现在这很有意义。这很接近,并使我找到了一个定义:url=>{:action=>“update”}的修复程序,最终使它工作了。@monocole-你完全正确。表单操作是“/1”,它确实正在尝试运行show方法。但是,我已经删除了用户控制器中的to_参数以及activerecord,表单仍以这种方式运行。是别的什么原因导致它这么做。。
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