Виртуальные атрибуты на новых моделях в Rails? - PullRequest
0 голосов
/ 06 февраля 2010

Эта определенная часть моего приложения заботится о создании модели Webshop для сетей магазинов (таких как H & M), которая имеет такую ​​модель. Если у сети есть веб-сайт, который также является интернет-магазином, он создает одну модель Интернет-магазина.

Если веб-сайт не является интернет-магазином, он позволяет ему быть в курсе в модели цепочки.

ПРОБЛЕМА: я делаю это с флажком и виртуальными атрибутами. Поэтому при отправке запроса контроллеру цепочки флажок устанавливает значение set_webshop.

# Chain Model

class Chain
 has_one :webshop, :dependent => :destroy

 def set_webshop
  self.webshop.url == self.website unless self.webshop.blank?
 end

 def set_webshop=(value)
   if self.webshop.blank?
    value == "1" ? self.create_webshop(:url => self.website) : nil
   else
    value == "1" ? nil : self.webshop.destroy
   end
 end
end

# Chain Controller

class ChainsController < ApplicationController
  def create
    @chain = Chain.new(params[:chain])

    respond_to do |format|
      if @chain.save
        flash[:notice] = 'Chain was successfully created.'
        format.html { redirect_to(@chain) }
        format.xml  { render :xml => @chain, :status => :created, :location => @chain }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @chain.errors, :status => :unprocessable_entity }
      end
    end
  end

  def update
    params[:chain][:brand_ids] ||= []
    @chain = Chain.find(params[:id])

    respond_to do |format|
      if @chain.update_attributes(params[:chain])
        flash[:notice] = 'Chain was successfully updated.'
        format.html { redirect_to(@chain) }
        format.js
      else
        format.html { render :action => "edit" }
      end
    end
  end
end

Все отлично работает при обновлении цепной модели, но когда нет при создании новой? Я не могу понять, почему?

Вот запросы POST и PUT.

# POST (Doesn't work - does not create a Webshop)
Processing ChainsController#create (for 127.0.0.1 at 2010-02-06 11:01:52) [POST]
  Parameters: {"commit"=>"Create", "chain"=>{"name"=>"H&M", "set_webshop"=>"1", "website"=>"http://www.hm.com", "desc"=>"...", "email"=>"info@hm.com"}, "authenticity_token"=>"[HIDDEN]"}


# PUT (Works - does create a Webshop)
Processing ChainsController#update (for 127.0.0.1 at 2010-02-06 11:09:13) [PUT]
  Parameters: { "commit"=>"Update", "chain"=> { "name" => "H&M", "set_webshop"=>"1", "website" => "http://www.hm.com", "desc" => "...", "email" => "info@hm.com"}, "authenticity_token"=>"[HIDDEN]", "id"=>"444-h-m"}

Есть ли специальный способ обработки virtual_attributes в новых моделях в Rails?

1 Ответ

3 голосов
/ 06 февраля 2010

Это, вероятно, не работает, потому что в этой строке

self.create_webshop(:url => self.website)

для создания интернет-магазина для новой цепочки у вас еще нет идентификатора цепочки (он еще не был создан), поэтому нет возможности создать ассоциацию.

Определите обратный вызов after_save и создайте там интернет-магазин. Чтобы запомнить значение этого флажка, вы можете сохранить его в attr_accessor.

...