2013-02-22 41 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

相關問題