0

我正在使用 Rails 3 和 Devise 进行身份验证。当我尝试更新我current_user的 时,会引发异常,说明:

Couldn't find User with id=edit
app/controllers/users_controller.rb:49:in `update'

这是updateedit在用户控制器中:

#UsersController.rb
def update
    @user = User.find(params[:id])

    respond_to do |format|
      if @user.update_attributes(params[:user])
        format.html { redirect_to @user, notice: 'User was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: "edit" }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

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

这是/views/layouts/_navigation.html.erb

<%= link_to "Home", root_path, :class => 'brand' %>
<ul class="nav">
  <% if user_signed_in? %>
    <li>
    <%= link_to('Logout', destroy_user_session_path, :method=>'delete') %>
    </li>
  <% else %>
    <li>
    <%= link_to('Login', new_user_session_path)  %>
    </li>
  <% end %>
  <li>
  <%= link_to('About', help_about_path) %>
  </li>
  <% if user_signed_in? %>
    <li>
    <%= link_to('Edit Account', edit_user_path(current_user)) %>
    </li>
  <% end %>
  <% if user_signed_in? and current_user.role == "gen_admin" || current_user.role == "teacher" %>
    <li>
    <%= link_to('View Students', users_path ) %>
    </li>
  <% end %>
  <% if user_signed_in? and current_user.role == "gen_admin" || current_user.role == "teacher" %>
    <li>
    <%= link_to('New User', new_user_path ) %>
    </li>
  <% end %>
  <% if user_signed_in? %>
     <li>
     <%= link_to('Student Data', data_path) %>
     </li>
    <% end %>
</ul>

最后,这里是/views/devise/registrations/edit.html.erb

<h2>Edit <%= resource_name.to_s.humanize %></h2>

<%= form_for(resource, :as => resource_name, :url => edit_user_registration_path(resource_name), :html => { :method => :put }) do |f| %>
  <%= devise_error_messages! %>

  <div><%= f.label :email %><br />
  <%= f.email_field :email, :autofocus => true %></div>

  <div><%= f.label :teacher %><br />
  <%= f.text_field :teacher %></div>

  <% if devise_mapping.confirmable? && resource.pending_reconfirmation? %>
    <div>Currently waiting confirmation for: <%= resource.unconfirmed_email %></div>
  <% end %>

  <div><%= f.label :new_password %> <i>(leave blank if you don't want to change it)</i><br />
  <%= f.password_field :password, :autocomplete => "off" %></div>

  <div><%= f.label :password_confirmation %><br />
  <%= f.password_field :password_confirmation %></div>

  <div><%= f.label :current_password %> <i>(we need your current password to confirm your changes)</i><br />
  <%= f.password_field :current_password %></div>

  <div><%= f.submit "Update" %></div>
<% end %>

<%= link_to "Back", :back %>

为什么用户 id=edit?这是我的哈希,如果有帮助的话:

{"utf8"=>"✓",
 "_method"=>"put",
 "authenticity_token"=>"7g1WsNCVuNY/5ZTeBUdv97tbdAPacvvDAzBSMGCcuNY=",
 "user"=>{"email"=>"email@admin.com",
 "teacher"=>"Demont",
 "password"=>"[FILTERED]",
 "password_confirmation"=>"[FILTERED]",
 "current_password"=>"[FILTERED]"},
 "commit"=>"Update",
 "id"=>"edit",
 "format"=>"user"}
4

3 回答 3

1

很可能你在添加时我的路线有冲突UsersController

设计的维基页面解释了这一点。

编辑用户的默认设计路线是,/users/edit但在您的控制器路径中更新操作是/users/:id. 为什么你有“编辑”而不是user_id

于 2013-05-01T05:24:36.573 回答
1

尝试使用:

@user = current_user

您的路线或编辑表单似乎有问题。尝试使用他们的维基页面中的表格...... https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-edit-their-password

但是上面的代码应该可以解决这个问题

于 2013-05-01T05:25:26.290 回答
0

利用

<%= form_for(@resource, :as => resource_name, :url => edit_user_registration_path(resource_name), :html => { :method => :put }) do |f| %>

到您的表单视图和

@resource = User.find(params[:id])

在您的编辑操作中。

于 2013-05-01T05:39:43.717 回答