2010-02-06 4 views
0

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

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

ПРОБЛЕМА: Я делаю это с помощью флажка и виртуальных атрибутов. Поэтому при отправке запроса контроллеру цепи флажок устанавливает значение «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 

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

Вот запросы 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"=>"[email protected]"}, "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" => "[email protected]"}, "authenticity_token"=>"[HIDDEN]", "id"=>"444-h-m"} 

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

ответ

3

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

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

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

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

+0

Спасибо, работал как шарм! –

Смежные вопросы