0

仮想属性を持つ次のUserモデルがあります。artist_attributes

class User < ActiveRecord::Base
  attr_accessor :artist_attributes
  attr_accessible :artist_attributes

  belongs_to :artist
  accepts_nested_attributes_for :artist, update_only: true
end

アーティストモデルは次のとおりです。

class Artist < ActiveRecord::Base
  has_one :user
end

問題は、仮想属性が設定されていないことです。たとえば、ここで私のユーザーコントローラー:

class Members::UsersController < Members::BaseController
  def update
    current_user.artist_attributes = params[:user].delete(:artist_attributes)
    p current_user.artist_attributes # => nil
    # ...
  end
end

そして、ここに提出されるフォームがあります:

<%= simple_form_for current_user, url: members_profile_path do |f| %>
  <%= f.simple_fields_for :artist do |ff| %>
    <%# ... %>
  <% end %>

  <%= f.submit "Edit profile", class: "btn btn-primary", disable_with: "Editing profile..." %>
<% end %>

artist_attributes仮想属性が設定されていないのはなぜですか?ネストされたフォームが原因ですか?

アップデート

フォームを送信した後のparamsハッシュは次のとおりです。

Parameters: {
  "utf8"=>"✓",
  "authenticity_token"=>"XQI4y7x7CSjxUhdYvEv2bLEjitwCfXxeTBUU3+kYS4g=",
  "user"=> {
    "email"=>"youjiii@gmail.com",
    "forename"=>"You",
    "surname"=>"Jiii",
    "password"=>"[FILTERED]",
    "password_confirmation"=>"[FILTERED]",
    "artist_attributes" => {
      "bio"=>"NERVO is awesome!",
      "phone_number"=>"",
      "city"=>"",
      "country"=>"Afghanistan"
    }
  },
  "commit"=>"Edit profile"}
4

1 に答える 1

1

これを試して:

変化する

current_user.artist_attributes = params[:user].delete(:artist_attributes)

if current_user.update_attributes(params[:user])
  # happy result
end

ネストされた属性は、Railsによって自動的に処理される必要があります。カスタムセッターが必要な場合は、定義すれば問題ありartist_attributes=ません。Rails4はPostgresqlのハッシュ値をサポートすると思います。一方、Rails 3についてはこちらをご覧ください:http://travisjeffery.com/b/2012/02/using-postgress-hstore-with-rails/

編集

あなたのコメントによると、目標が単にAPIに送信することである場合、仮想属性には保存しません。

# Controller
def update
  if User.update_artist(params[:user][:artist_attributes])
    # happy thoughts
  end
end

# User model
def update_artist(artist_attributes)
  begin
    # API call
  rescue api exception
    log a message like "Couldn't update at this moment"   
  end
end
于 2013-02-02T17:14:03.713 に答える