1

我正在尝试创建自定义表单,允许管理员打开和关闭用户的用户权限,并将它们保存到数据库中。我一定是做错了什么,因为页面生成正常,提交按钮提交给操作正常,但没有任何东西保存到数据库中,它只是再次呈现我的初始视图。谁能看到我做错了什么?

编码

路线:

resources :users do
  member do
    get 'assign'
    put 'assign_update'
  end
end
...

控制器(这种奇怪的做法是为了规避管理员和其他属性不可访问的事实。这可能是一团糟。):

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

def assign_update
  admin_protected = params[:user].delete(:admin)

  @user = User.find(params[:id])
  @user.admin = admin_protected

  if @user.save
    flash[:success] = "User updated"
    redirect_to users_path
  else
    render 'assign'
  end
end

看法:

...
<%= form_for(@user, url: { controller: 'users', 
  action: 'assign_update'}, method: 'put') do |f| %>
  <%= f.label :admin, 'Is admin?', class: 'checkbox inline' %>
  <%= f.check_box :admin %>
  <%= f.submit "Save changes", class: "btn btn-large btn-primary" %>
<% end %>
4

2 回答 2

1

因此,总结一下我们在问题下方评论部分的对话......

发现问题是对其他用户模型属性的验证。无法保存用户实例,因为save执行方法时未通过验证。结果,Rails 只是呈现分配视图。

update_attribute方法在没有模型验证和批量分配保护的情况下更新属性。在这种情况下,admin属性符合这两个标准。

于 2013-02-22T20:22:28.720 回答
0

您应该在模型中使用 attr_accessible 并从参数中手动选择这些字段并单独分配它们,确保 admin 字段不包含在分配给 attr_accessible 声明的字段列表中

所以

def assign_update
  admin_protected = params[:user].delete(:admin)

  @user = User.find(params[:id])
  @user.admin = admin_protected

  if @user.save
    flash[:success] = "User updated"
    redirect_to users_path
  else
    render 'assign'
  end
end

变成

    def assign_update
#      admin_protected = params[:user].delete(:admin)

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

      if @user.save
        flash[:success] = "User updated"
        redirect_to users_path
      else
        render 'assign'
      end
    end

问题是在你的方法中你仍然在大量分配。

要调试实际发生的事情,您应该仔细查看日志文件输出

更新

检查错误列表。将以下内容添加到您的表单中

  <% if @user.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@user.errors.count, "error") %> prohibited this account from being saved:</h2>

      <ul>
      <% @user.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

它应该让您、广告您的用户更清楚地了解什么是错误的以及如何解决它

于 2013-02-22T19:01:10.763 回答