在devise rails中编辑“admins”的链接

时间:2014-01-21 20:58:44

标签: ruby-on-rails ruby devise rolify

我有一个rails app,使用devise进行注册并为角色进行rolify。我想有一个索引页面,其中包含管理员可以访问的每个用户的编辑链接。此编辑页面也可以在不使用密码的情况下工作。现在,edit_user_path会转到当前用户的编辑页面,这不是我想要的。

实施此类引用的最佳方式是什么?我已经在这里阅读了一些关于此的帖子,但似乎没有人给我我想要的东西。

请指出我正确的方向!

EDITED 我试图这样做,仍然遇到“当前密码不能为空” 来自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文件中我有这一行来呈现编辑页面。我可以显示编辑页面但输入信息然后点击更新只是向我/用户发送错误“当前密码不能为空”

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

4 个答案:

答案 0 :(得分:1)

Devise没有任何类型的Admin界面。如果您是唯一的管理员并且不介意一点粗暴 - 总有控制台和/或脚手架。您可以创建一个UserController,它继承自ApplicationController并执行基本视图,在同一个控制器中编辑方法。通过在用户视图文件夹中放置相应的new.html.erb,edit.html.erb等文件,添加/编辑/删除用户应该与其他任何CRUD没有区别,因为Devise的用户是另一个类似的模型。在用户身上使用脚手架,你就可以得到你想要的东西。

还有很多好的宝石可以让管理界面变得简单:https://github.com/gregbell/active_admin活动管理员,https://github.com/sferik/rails_admin Rails管理员,我相信还有更多的东西。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

看起来我通过添加:

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

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

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

感谢大家的帮助!

答案 3 :(得分:0)

如果您只需要管理员编辑现有用户,您可以在单独的UsersController中进行编辑,显示和更新操作(并保留新操作并创建操作以进行设计)。这样你可以将@user = User.find(params[:id]逻辑移出你的形式,进入控制器,正如@Saurabh Lodha所提到的那样。

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

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

我希望更多地澄清一下!祝好运! :)