Rails在一个页面上将用户编辑为管理员

时间:2013-12-24 14:27:01

标签: ruby-on-rails devise ruby-on-rails-4

我正在使用Rails 4.0.1和Devise 3.3.2。

我正在尝试创建一个管理员可以更新多个用户角色的页面。类似的东西:

manage.html.erb:

<% @user.each do |user| %>
  <%= form_for user, :html => { :multipart => true} do |f| %>
    <%= user.profile_name %>
    <%= user.right %>
    <%= f.label :right %><br />
    <%= f.radio_button :right, "None" %>User
    <%= f.radio_button :right, "Administrator" %>Administrator</div>
    <%= f.submit %>
  <% end %>
<% end %>

user_controller.rb:

def manage
  @user = User.all
  respond_to do |format|
    @user.update(user_params)
  end
end

private
def user_params
  params.require(:user).permit(:id, :right)
end

但我收到了一个错误。据我了解,它无法理解用户的身份。任何想法或教程?

Started GET "/manage" for 127.0.0.1 at 2013-12-24 22:22:23 +0600
Processing by UserController#update as HTML 
Completed 400 Bad Request in 15ms

ActionController::ParameterMissing (param not found: user):
 app/controllers/user_controller.rb:46:in `user_params'
 app/controllers/user_controller.rb:39:in `block in update'
 app/controllers/user_controller.rb:38:in `update'

2 个答案:

答案 0 :(得分:2)

这里有很多问题......但我认为你的第一个挑战是:

您似乎正在尝试同时执行表单的显示,并在同一操作中处理表单的提交。那不行。

rails约定有一对动作:new + create和edit + update。 newedit只关注显示表单,createupdate处理提交形式。

因此,您需要做的第一件事就是在控制器中执行两个操作。一个人将分配@user然后呈现您拥有的视图,另一个将使用您在提交表单时获得的参数,并使用这些参数执行某些操作来更新用户,就像您当前尝试做的那样在控制器的render块中。

接下来要遇到的其他问题是:

  • 除非您对此处的代码进行更改,否则使用form_for不会发布到您的自定义路线
  • 您正在为每个用户呈现一个表单,因此您将为每个用户提供一个提交按钮,但听起来您真的想要一个提交的所有用户一个表单按钮
  • 更新多个记录比在所有记录上调用一个update方法并传入所有参数更复杂

This railscast on editing multiple records可能会有用。

答案 1 :(得分:1)

当您提交此表单时,它将使用您控制器中的createupdate方法,而不是manage,除非您专门添加了PATCH路由为了它。

因此,您需要确保在这些方法中使用user_params

此外,除非你的问题是拼写错误,否则<% end %>

中缺少manage.html.erb