2013-02-11 21 views
1

我第一次使用STI創建了一個應用程序,並且我偶然發現了一個令人困惑的障礙。Rails STI:ActiveRecord PUT事務工作,但字段不更新?

考慮以下兩種型號,並繼承:

User.rb 
class User < ActiveRecord::Base 
attr_accessible :email, :first_name, :last_name, #more follows 


Waiter.rb 
class Waiter < User 

我在/服務員/用戶/做了一個表格[:編號] /編輯執行以下操作:

<%= simple_form_for @user, 
     :url => { :controller => "admin/waiters/users", :action => "update"} do |f| %> 
<%= f.input :first_name %> 
<%= f.input :last_name %> 
<%= f.input :email %> 
<%= f.input :start_date %> 
<%= f.button :submit, "Save", class: "btn btn-primary"%> 
<% end %> 

但是,按提交是通過發佈帖子請求,但未能更新實際數據。是否因爲路線還是錯誤?請參閱下面的SQL轉儲:

Started PUT "/admin/waiters/users/6" for 127.0.0.1 at 2013-02-10 20:45:59 -0800 
Processing by Admin::Waiters::UsersController#update as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"6EB82/aWryLgj/tZcvoOWmw98PAPmJYUViAQronv6Fw=", "waiter"=>{"first_name"=>"John", "last_name"=>"Smith", "email"=>"[email protected]"}, "commit"=>"Save", "id"=>"6"} 
    User Load (0.6ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1 
    Role Load (0.5ms) SELECT "roles".* FROM "roles" INNER JOIN "user_roles" ON "roles"."id" = "user_roles"."role_id" WHERE "user_roles"."user_id" = 1 
    Waiter Load (0.6ms) SELECT "users".* FROM "users" WHERE "users"."id" = 6 LIMIT 1 
    (0.1ms) BEGIN 
    User Exists (0.4ms) SELECT 1 AS one FROM "users" WHERE ("users"."email" = '[email protected]' AND "users"."id" != 6) LIMIT 1 
    CACHE (0.0ms) SELECT 1 AS one FROM "users" WHERE ("users"."email" = '[email protected]' AND "users"."id" != 6) LIMIT 1 
    (2.4ms) UPDATE "users" SET "perishable_token" = 'FplOAv6d4eOBv0gHW3b', "updated_at" = '2013-02-11 04:45:59.206797' WHERE "users"."id" = 6 
    (0.7ms) COMMIT 
Redirected to http://localhost:3000/admin/waiters/users 

控制器似乎在更新操作後重新定向,但數據未保存。我在這裏錯過了什麼?感謝Rails初學者的幫助。

這是在控制器/管理/服務員發現用戶控制器/

def edit 
    form_info 
    @user = Waiter.find(params[:id]) 
    end 

    def update 
    @user = Waiter.find_by_id(params[:id]) 
    if @user.update_attributes(params[:user]) 
     flash[:notice] = "Successfully assigned Waiter." 
     redirect_to admin_waiters_users_url() 
    else 
     form_info 
     render :action => 'edit' 
    end 
    end 
+0

你可以發佈你的管理員/用戶/服務員控制器?我懷疑問題是你做@ user.update(params [:user]),而你需要做@ user.update(params [:waiter])。 – Max 2013-02-11 05:32:36

+0

添加控制器! – mztwo 2013-02-11 05:37:09

回答

3

的問題是,你是從params哈希表拉動錯誤的價值觀。查看日誌:

Parameters: {"utf8"=>"✓", "authenticity_token"=>"6EB82/aWryLgj/tZcvoOWmw98PAPmJYUViAQronv6Fw=", "waiter"=>{"first_name"=>"John", "last_name"=>"Smith", "email"=>"[email protected]"}, "commit"=>"Save", "id"=>"6"} 

更新的屬性通過waiter鍵進行散列處理。現在看看你的更新代碼:

if @user.update_attributes(params[:user]) 

你正在得到params[:user]。由於您使用的是STI,我假設您想保留params [:user],所以您需要更改服務員的表單代碼。你應該這樣做:

<%= simple_form_for @user, as: :user, 
     :url => { :controller => "admin/waiters/users", :action => "update"} do |f| %> 
+0

謝謝!隨着我學習越來越多的Rails,我將詳細研究這一點。但它現在起作用了。 – mztwo 2013-02-11 05:50:36