Как я могу получить значение before_save в контроллере в Rails 3? - PullRequest
1 голос
/ 13 мая 2011
def update
    @product_category = @business_category.product_categories.find(params[:id])
    product_category_was = @business_category.product_categories.find(params[:id])

    respond_to do |format|
      if @product_category.update_attributes(params[:product_category])
        share_associations(@product_category, product_category_was) if in_params('_maps_attributes', 'product_category')

        format.js
        format.html { redirect_to(admin_product_categories_path, :notice => 'Product category was successfully updated.') }
        format.xml  { head :ok }
      else
        format.js
        format.html { render :action => "edit" }
        format.xml  { render :xml => @product_category.errors, :status => :unprocessable_entity }
      end
    end
  end

Функция share_associations имеет параметры @product_category и product_category_was.Проблема в том, что когда я вызываю product_category_was.send ('images'), например (который я должен вызывать с помощью send, поскольку вызов динамический), он, очевидно, вытягивает самые новые связанные изображения, а не изображения, которые были связаны.Могу ли я в любом случае получить объект, чтобы получить изображения, которые были связаны в тот момент, когда он был сделан?

Ответы [ 3 ]

0 голосов
/ 13 мая 2011

Понятия не имею, о чем говорит Арнеп, и о каких проблемах вы столкнулись. То, что ты делаешь, работает для меня на двух разных находках в ассоциации, и так и должно быть.

irb(main):016:0> s = School.first
=> #<School id: 2, name: "Bar", created_at: "2011-04-09 17:48:57", updated_at: "2011-05-13 09:13:38", confirmed: nil, zipcode: nil>
irb(main):017:0> g1 = s.grades.find 4
=> #<Grade id: 4, name: "4th", type: nil, school_id: 2, created_at: "2011-04-19 03:17:49", updated_at: "2011-05-13 09:15:17">
irb(main):018:0> g2 = s.grades.find 4
=> #<Grade id: 4, name: "4th", type: nil, school_id: 2, created_at: "2011-04-19 03:17:49", updated_at: "2011-05-13 09:15:17">
irb(main):019:0> g1.update_attributes :name => '5th'
=> true
irb(main):020:0> g2
=> #<Grade id: 4, name: "4th", type: nil, school_id: 2, created_at: "2011-04-19 03:17:49", updated_at: "2011-05-13 09:15:17">
irb(main):021:0> g1
=> #<Grade id: 4, name: "5th", type: nil, school_id: 2, created_at: "2011-04-19 03:17:49", updated_at: "2011-05-13 09:16:02">
irb(main):022:0> 

На самом деле, обычно люди задают обратный вопрос - как получить уже созданный экземпляр объекта для перезагрузки из БД. Возможно, проблема в вашем share_associations методе или в чем-то еще, что вы пока не показываете.

0 голосов
/ 14 мая 2011

Я нашел способ сделать то, что работает на данный момент.Это не самый лучший способ, но пока он работает.Я в основном создал пустой массив и вставил в него массив product_categories.Это сделало так, чтобы значение больше не было вызовом, поэтому значение не меняется.Надеюсь, это поможет кому-то еще.

def update
    @product_category = @business_category.product_categories.find(params[:id])
    if in_params('_maps_attributes', 'product_category')
      media_was = Array.new
      media_was = media_was | @business_category.product_categories.find(params[:id]).send(map_type('product_category').pluralize)
    end

    respond_to do |format|
      if @product_category.update_attributes(params[:product_category])
        share_associations(@product_category, media_was) if in_params('_maps_attributes', 'product_category')

        format.js
        format.html { redirect_to(admin_product_categories_path, :notice => 'Product category was successfully updated.') }
        format.xml  { head :ok }
      else
        format.js
        format.html { render :action => "edit" }
        format.xml  { render :xml => @product_category.errors, :status => :unprocessable_entity }
      end
    end
  end
0 голосов
/ 13 мая 2011

Я думаю, вам нужна глубокая копия вашего объекта, потому что нормальная ассоциация (=) создаст только ссылку:

product_category_was = Marshal::load(Marshal::dump(@product_category))

Это может работать не для всех видовобъектов, но для обычных объектов Rails это должно работать.

...