0

我有一个 rails 应用程序,它使用 devise 进行注册并 rolify 用于角色。我想要一个索引页面,其中包含管理员可以访问的每个用户的编辑链接。此编辑页面也应该无需使用密码即可工作。现在 edit_user_path 进入当前用户的编辑页面,这不是我想要的。

实施这种网站的最佳方法是什么?我已经在这里阅读了一些关于此的帖子,但似乎没有一个能给我我想要的东西。

请指出我正确的方向!

已编辑 我正在尝试这样做,但仍然遇到来自 Users_controller 的“当前密码不能为空”:

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

    if params[:user][:password].blank?
      params[:user].delete(:password)
      params[:user].delete(:password_confirmation)
    end

    if @user.update_attributes(user_params)
      redirect_to users_path, :notice => "User updated."
    else
      redirect_to users_path, :alert => "Unable to update user."
    end
  end

在我看来,我有一个 edit.html.erb 文件,它呈现以下形式:

<div class="panel-body">
    <%= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put }) do |f| %>
      <%= devise_error_messages! %>

      <div class="form-group">
        <%= f.label :email %>
        <%= f.email_field :email, class: "form-control", :autofocus => true %>
      </div>

      <div class="form-group">
        <%= f.label :username %>
        <%= f.text_field :username, class: "form-control" %>
      </div>

      <div class="form-group">
        <%= f.label :firstname %>
        <%= f.text_field :firstname, class: "form-control" %>
      </div>

      <div class="form-group">
        <%= f.label :lastname %>
        <%= f.text_field :lastname, class: "form-control" %>
      </div>

      <div class="form-group">
        <%= f.label :city %>
        <%= f.text_field :city, class: "form-control" %>
      </div>

      <div class="form-group">
        <%= f.label :zip %>
        <%= f.text_field :zip, class: "form-control" %>
      </div>

      <div class="form-group">
        <%= f.label :state %>
        <%= f.text_field :state, class: "form-control" %>
      </div>

      <div class="form-group">
        <%= f.label :country %>
        <%= f.text_field :country, class: "form-control" %>
      </div>

      <div class="form-group">
        <%= f.submit "Update", class: "btn btn-primary" %>
      </div>
    <% end %>
  </div>

最后在我的 routes.rb 文件中,我有这一行来呈现编辑页面。我可以显示编辑页面,但输入信息然后点击更新只会将我射到 /users 并出现错误“当前密码不能为空”

get 'pressroom/accounts/:id/edit' => 'users#edit', :as => :admin_edit_user
4

4 回答 4

1

设计没有任何类型的管理界面。如果您是唯一的管理员并且不介意有点粗鲁 - 总有控制台和/或脚手架。您可以创建一个继承自 ApplicationController 的 UserController 并执行基本视图,在同一控制器中编辑方法。通过在 User Views 文件夹中放置适当的 new.html.erb、edit.html.erb 等文件,添加/编辑/删除用户的工作方式应该与任何其他 CRUD 没有什么不同,因为 Devise 的用户是另一个模型。在用户上使用脚手架,您可以获得所需的内容。

还有很多优秀的宝石可以让设置管理界面变得轻而易举:https ://github.com/gregbell/active_admin Active Admin,https ://github.com/sferik/rails_admin Rails Admin,我确定在那里还有一堆。

于 2014-01-21T22:04:48.420 回答
1

你可以看看这个 RailsCast。请记住某些方面可能已过时 如果您想从头开始构建,一般原则保持不变

http://railscasts.com/episodes/19-where-administration-goes

于 2014-01-21T23:12:08.377 回答
0

看起来我通过添加:

<div class="panel-body">
<% @user = User.find(params[:id]) %>

    <%= form_for(@user) do |f| %>

到我的 _form.html.erb 文件的顶部

感谢大家的帮助!

于 2014-01-22T22:40:26.310 回答
0

如果您唯一需要的是管理员编辑现有用户,您可以在单独的 UsersController 中进行编辑、显示和更新操作(并留下新的和创建操作以供设计)。这样一来,您就可以将该@user = User.find(params[:id]逻辑从表单中移到控制器中,正如@Saurabh Lodha 提到的那样。

我只是认为答案中缺少一件事:确保还编辑您的 routes.rb。使用路径前缀,这样您的路由就不会变得混乱,就像这样:
devise_for :users, :path_prefix => 'my' resources :users

这意味着当您对 current_user 调用 edit 时,它将转到 my/users/edit,当您从管理面板的用户列表中对任何选定用户调用 edit 时,它将转到 users/user_id/edit。

我希望澄清一点!祝你好运!:)

于 2014-03-06T11:35:57.097 回答