1

初めて STI を使用してアプリケーションを作成していますが、不可解な障害に遭遇しました。

継承を持つ次の 2 つのモデルがあるとします。

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


Waiter.rb
class Waiter < User

/waiters/users/[:id]/edit に次のようなフォームを作成しました:

<%= 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"=>"john@foobaz.com"}, "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" = 'john@foobaz.com' AND "users"."id" != 6) LIMIT 1
  CACHE (0.0ms)  SELECT 1 AS one FROM "users" WHERE ("users"."email" = 'john@foobaz.com' 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スターターの助けに感謝します。

これは、controller/admin/waiters/ にあるユーザー コントローラーです。

 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
4

1 に答える 1

3

問題は、params ハッシュから間違った値を取得していることです。ログを見てください:

Parameters: {"utf8"=>"✓", "authenticity_token"=>"6EB82/aWryLgj/tZcvoOWmw98PAPmJYUViAQronv6Fw=", "waiter"=>{"first_name"=>"John", "last_name"=>"Smith", "email"=>"john@foobaz.com"}, "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| %>
于 2013-02-11T05:42:39.807 に答える