Active Admin,Rails 4嵌套表单DELETE然后INSERT has_one Model

时间:2013-08-01 23:31:19

标签: forms nested paperclip activeadmin ruby-on-rails-4

当您编辑has_one个人资料的用户时,活动管理员删除个人资料并重新创建,这样可以通过回形针删除头像图像

如何让主动管理员只更新嵌套表单而不删除并重新创建它。

这是我的ActiveAdmin:用户代码

ActiveAdmin.register User do
  menu :priority => 2

  ## Controller
  controller do

    def update
      if params[:user][:password].blank?
        params[:user].delete("password")
        params[:user].delete("password_confirmation")
      end

      if params[:user][:profile_attributes][:avatar].blank?
        params[:user][:profile_attributes].delete("avatar")
      end

      super
    end

    def permitted_params
      params.permit user: [:username, :email, :password, :password_confirmation, :approved, role_ids: [], profile_attributes: [:first_name, :last_name, :date_of_birth, :avatar]]
    end

  end

  #Scopes
  scope :all, default: true
  scope :admins
  scope :editors
  scope :members

  ## Filters
  filter :username
  filter :email

  ## Index
  index do
    column :id
    column :first_name do |user|
      user.profile.first_name unless user.profile.nil?
    end
    column :last_name do |user|
      user.profile.last_name unless user.profile.nil?
    end
    column :username
    column :email
    column :role, :sortable => false
    default_actions
  end

  ## Form
  form :html => {:multipart => true} do |f|

    f.inputs "User Account Details" do
      f.input :username
      f.input :email
      f.input :roles
      f.input :approved
      f.input :password, hint: "leave it blank if you don't want to change it"
      f.input :password_confirmation
    end

    f.inputs "Profile Details",  for:  [:profile, f.object.profile || f.object.build_profile] do |profile_form|
        profile_form.input :first_name
        profile_form.input :last_name
        profile_form.input :date_of_birth, as: :date_select, start_year: Date.today.year-80, end_year: Date.today.year-13

        profile_form.input :avatar, :as => :file, :hint => profile_form.template.image_tag(profile_form.object.avatar.url(:small))
    end

    f.actions
  end

end

这是控制台显示的内容,请注意它删除了配置文件记录并重新创建它,这使得paperclip gem删除已经更新的图像。

Started PATCH "/admin/users/1" for 127.0.0.1 at 2013-08-02 01:29:09 +0200
Processing by Admin::UsersController#update as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"m9tBWsM+Jq0CWmSu2kCxCMn8xV3pgYQ0iFz5K9X5EjY=", "user"=>{"username"=>"admin", "email"=>"admin@example.com", "role_ids"=>["", "", "1", "2"], "approved"=>"1", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "profile_attributes"=>{"first_name"=>"Moe", "last_name"=>"Hassan", "date_of_birth(1i)"=>"1935", "date_of_birth(2i)"=>"4", "date_of_birth(3i)"=>"4", "id"=>"58"}}, "commit"=>"Update User", "id"=>"1"}
  User Load (0.6ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1 ORDER BY "users"."id" ASC LIMIT 1
   (0.3ms)  SELECT COUNT(*) FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'admin') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)))  [["user_id", 1]]
  User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1  [["id", "1"]]
Unpermitted parameters: id
Unpermitted parameters: utf8, _method, authenticity_token, commit, id
  Role Load (0.4ms)  SELECT "roles".* FROM "roles" WHERE "roles"."id" IN (1, 2)
  Role Load (0.3ms)  SELECT "roles".* FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1  [["user_id", 1]]
   (0.1ms)  BEGIN
   (0.1ms)  COMMIT
  Profile Load (0.2ms)  SELECT "profiles".* FROM "profiles" WHERE "profiles"."user_id" = $1 ORDER BY "profiles"."id" ASC LIMIT 1  [["user_id", 1]]
   (0.1ms)  BEGIN
[AWS S3 200 1.692562 0 retries] head_object(:bucket_name=>"assets.goldpricenetwork.dev",:key=>"public/avatars/58/original-901301_3903423203601_1063661495_o.jpg")  

[AWS S3 200 0.305978 0 retries] head_object(:bucket_name=>"assets.goldpricenetwork.dev",:key=>"public/avatars/58/small-901301_3903423203601_1063661495_o.jpg")  

  SQL (0.3ms)  DELETE FROM "profiles" WHERE "profiles"."id" = $1  [["id", 58]]
[paperclip] deleting public/avatars/58/original-901301_3903423203601_1063661495_o.jpg
[AWS S3 204 0.261193 0 retries] delete_object(:bucket_name=>"assets.goldpricenetwork.dev",:key=>"public/avatars/58/original-901301_3903423203601_1063661495_o.jpg")  

[paperclip] deleting public/avatars/58/small-901301_3903423203601_1063661495_o.jpg
[AWS S3 204 0.255899 0 retries] delete_object(:bucket_name=>"assets.goldpricenetwork.dev",:key=>"public/avatars/58/small-901301_3903423203601_1063661495_o.jpg")  

   (2.2ms)  COMMIT
   (0.1ms)  BEGIN
  SQL (0.5ms)  INSERT INTO "profiles" ("created_at", "date_of_birth", "first_name", "last_name", "updated_at", "user_id") VALUES ($1, $2, $3, $4, $5, $6) RETURNING "id"  [["created_at", Thu, 01 Aug 2013 23:29:12 UTC +00:00], ["date_of_birth", Thu, 04 Apr 1935], ["first_name", "Moe"], ["last_name", "Hassan"], ["updated_at", Thu, 01 Aug 2013 23:29:12 UTC +00:00], ["user_id", 1]]
   (0.3ms)  COMMIT
Redirected to http://localhost:3000/admin/users/1
Completed 302 Found in 2552ms (ActiveRecord: 5.8ms)

任何解决方案?

2 个答案:

答案 0 :(得分:1)

尝试允许:profile_attributes的id属性

profile_attributes: [:id , ...]

并尝试删除此monkeypatch:

  if params[:user][:profile_attributes][:avatar].blank?
    params[:user][:profile_attributes].delete("avatar")
  end

答案 1 :(得分:0)

我遇到了同样的问题。您需要将semantic_fields_for用于嵌套属性。 这是我的解决方案:

f.inputs "User Fundamentals" do
...
end
if params[:action] == 'edit'
  f.inputs "User Profile" do
      f.semantic_fields_for :profile do |profile_form|
        profile_form.inputs :first_name,:last_name, etc..
      ...
elsif params[:action] == 'new'
  f.inputs :name => "User Profile", :for => [Profile.new] do |profile_form|
        profile_form.inputs :first_name,:last_name, etc..
      ...

希望这可以解决您的问题。