2013-02-22 76 views
1

我试图创建自定义表单,允许管理员切换用户的用户权限,并将其保存到数据库中。我必须做一些完全错误的事情,因为页面生成良好,并且提交按钮提交给操作正常,但没有任何操作保存到数据库,它只是再次呈现我的初始视图。任何人都可以看到我做错了什么?如何在Rails中正确创建自定义操作?

守则

路线:

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 %> 
+0

当你说“它只是渲染我的初始视图”,你的意思是它呈现分配视图? – 2013-02-22 18:24:45

+0

它显示了分配视图的内容是,我假设它是'render'assign''的结果,因为它不保存。 url更改为assign_update,如果我取消选中该框,它将保持未选中状态,但通过控制台检查数据库时,admin属性保持不变。 – 2013-02-22 18:26:53

+0

好的。这可能与问题没有直接关系,但是'admin_protected = params [:user] .delete(:admin)'似乎是可疑的。这行不会总是从用户参数中删除'admin'属性吗? – 2013-02-22 18:30:32

回答

1

因此,要总结我们在注释部分下的对话问题...

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

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

0

你应该在你的模型使用attr_accessible从PARAMS手工采摘这些领域拥有并赋予它们分别确保管理领域不包括在分配给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 

的问题是,在你的方法,你的仍然是质量分配。

调试的是实际发生的log文件输出

UPDATE

检查错误列表中,您应该仔细看看。 以下内容添加到您的窗体

<% 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 %> 

它应该给你,广告用户的什么是错的一个清晰的概念,以及如何解决它

+1

这是一个有趣的观察。如果问题出在管理员属性的集体分配上,Rails不应该抛出一个批量赋值异常而不是重新赋值赋值视图? – 2013-02-22 19:05:34

+0

我在模型中使用'attr_accessible',管理员不在列表中。就我所见,你对代码的改变也不会真正改变它的功能。您仍然手动设置变量,而不是使用'update_attributes',这正是我的代码所做的。您所做的所有操作都将我分配给'@ user.admin'的值从变量'admin_protected'移出。 – 2013-02-22 19:09:44

+0

我应该补充一点,就像我尝试过的健全检查一样,它的功能也是一样的。 :) – 2013-02-22 19:10:18

相关问题