Проблема с acceptpts_nested_attributes_for при использовании authlogic_oauth - PullRequest
0 голосов
/ 29 января 2010

У меня есть следующие модели:

class Merchant
  acts_as_authentic
  has_one :store
  accepts_nested_attributes_for :store
end

class Store
  belongs_to :merchant
end

Я использую гем authlogic_oauth для аутентификации в Твиттере. При регистрации сохраняю модель Merchant и Store. Если я отключу oauth-аутентификацию, обе модели будут сохранены. Когда я включаю oauth-аутентификацию, сохраняется только экземпляр Merchant.

Потратив некоторое время на просмотр гем-кода authlogic_oauth, я думаю, что нашел виновника. В геме authlogic_oauth хранятся атрибуты ActiveRecord в сеансе во время вызовов oauth. Но он не хранит атрибуты ассоциаций.

# authlogic_oauth : lib/authlogic_oauth/acts_as_authentic.rb
def save(perform_validation = true, &block)
  if perform_validation && block_given? && redirecting_to_oauth_server?
    # My comment: Any nested attributes are not saved in the session
    session_class.controller.session[:authlogic_oauth_attributes] = attributes.reject!{|k, v| v.blank?}
    # some code
  end
  # some code
end

Я могу взломать гем-код, но мне интересно, есть ли лучшее решение.

1 Ответ

0 голосов
/ 29 января 2010

Я решил проблему, временно сохранив атрибуты Store в сеансе во время вызовов Oauth. Надеюсь, есть более эффективный способ решения этой проблемы.

class MerchantsController < ApplicationController
 before_filter :init_nested_attr

 def create
   @merchant = Merchant.new(params[:merchant])
   @merhcant.save do |result|
     #some code
   end
 end

private
 def init_nested_attr
   if session[:authlogic_oauth_attributes]
     params[:merchant] = session[:authlogic_oauth_attributes]
     params[:merchant][:store_attributes] = session.delete(:authlogic_oauth_store_attributes)
   else
     session[:authlogic_oauth_store_attributes] = params[:merchant][:store_attributes]
   end
 end
end
...