2014-09-15 3 views
1

Я пытаюсь обновить атрибут нормально, но он не обновляется.значения не обновляются в рельсах 3

Вот моя модель клиент

class Customer < ActiveRecord::Base 
     attr_accessible :name, :phone_number, :email 
     attr_accessible :first_name 
     attr_accessible :last_name 

     before_validation :parse_name 
     def name 
     "#{first_name} #{last_name}".strip 
     end 

    private 

    def parse_name 
    if attributes['name'].present? 
     self.first_name, self.last_name = attributes['name'].strip.split(' ', 2) 
    end 
    end 
end 

Я пытался обновить first_name и last_name, но не обновляется, но если я пытался обновить электронную почту он обновляет штраф

Вот мой рельсы консоли след обновление электронной

2.1.0dev :004 > a = Customer.find(5) 
    Customer Load (0.2ms) SELECT `customers`.* FROM `customers` WHERE `customers`.`id` = 5 LIMIT 1 
=> #<Customer id: 5, name: "First Last", phone_number: "1234567890", created_at: "2014-09-15 12:48:30", updated_at: "2014-09-15 14:32:17", first_name: "Fir 
2.1.0dev :008 > a = Customer.find(5) 
    Customer Load (0.1ms) SELECT `customers`.* FROM `customers` WHERE `customers`.`id` = 5 LIMIT 1 
=> #<Customer id: 5, name: "First Last", phone_number: "1234567890", created_at: "2014-09-15 12:48:30", updated_at: "2014-09-15 14:32:17", first_name: "Fir 
st", last_name: "Last", email: "[email protected]"> 
2.1.0dev :009 > a.email = "[email protected]" 
=> "[email protected]" 
2.1.0dev :010 > a.save 
    (0.2ms) BEGIN 
    Customer Exists (0.2ms) SELECT 1 AS one FROM `customers` WHERE (`customers`.`phone_number` = BINARY '1234567890' AND `customers`.`id` != 5) LIMIT 1 
    (0.4ms) UPDATE `customers` SET `email` = '[email protected]', `updated_at` = '2014-09-15 20:38:31' WHERE `customers`.`id` = 5 
    (104.9ms) COMMIT 
=> true 
2.1.0dev :011 > a 
=> #<Customer id: 5, name: "First Last", phone_number: "1234567890", created_at: "2014-09-15 12:48:30", updated_at: "2014-09-15 20:38:31", first_name: "Fir 
st", last_name: "Last", email: "[email protected]"> 

Но для обновления first_name и last_name является не работает

обновление last_name

2.1.0dev :012 > a.last_name = "last_name" 
=> "last_name" 
2.1.0dev :013 > a.save 
    (0.2ms) BEGIN 
    Customer Exists (0.7ms) SELECT 1 AS one FROM `customers` WHERE (`customers`.`phone_number` = BINARY '1234567890' AND `customers`.`id` != 5) LIMIT 1 
    (0.2ms) COMMIT 
=> true 
2.1.0dev :014 > a.save! 
    (0.2ms) BEGIN 
    Customer Exists (0.2ms) SELECT 1 AS one FROM `customers` WHERE (`customers`.`phone_number` = BINARY '1234567890' AND `customers`.`id` != 5) LIMIT 1 
    (0.1ms) COMMIT 
=> true 
2.1.0dev :015 > a 
=> #<Customer id: 5, name: "First Last", phone_number: "1234567890", created_at: "2014-09-15 12:48:30", updated_at: "2014-09-15 20:38:31", first_name: "Fir 
st", last_name: "Last", email: "[email protected]"> 

Использование обновления атрибутов

2.1.0dev :016 > a.update_attributes(:first_name => "test_name", :last_name => "test_name") 
    (0.2ms) BEGIN 
    Customer Exists (0.2ms) SELECT 1 AS one FROM `customers` WHERE (`customers`.`phone_number` = BINARY '1234567890' AND `customers`.`id` != 5) LIMIT 1 
    (0.2ms) COMMIT 
=> true 
2.1.0dev :017 > a 
=> #<Customer id: 5, name: "First Last", phone_number: "1234567890", created_at: "2014-09-15 12:48:30", updated_at: "2014-09-15 20:38:31", first_name: "Fir 
st", last_name: "Last", email: "[email protected]"> 

Я пытался решить ее, но она не работает. Может ли кто-нибудь рассказать мне, что мне не хватает. Я использую rails 3.2.14 and rails 2.1.0

+0

это оставаться такой же, когда вы запускаете 'a.reload'? –

ответ

2

У вас есть метод before_validation, где первая и фамилия устанавливается в зависимости от имени. У вашей записи уже есть имя, поэтому оно разбивает это имя и извлекает имя и фамилию.

2

Ваш before_validation переписывает значение, которое вы хотите установить. Я бы удалил метод анализа синтаксиса вместе и метод #name просто был рассчитанным значением на основе first_name и last_name, например.

class Customer < ActiveRecord::Base 
    attr_accessible :phone_number, :email, :first_name, :last_name 
    def name 
    "#{first_name} #{last_name}".strip 
    end 
end 

Если вы действительно должны #name= я бы сделал это, как

def name=(name_string) 
    self.first_name, self.last_name = name_string.strip.split(' ', 2) 
end 

Вы должны save для этих значений держать. Вы могли бы также сделать что-то вроде.

def update_name(name_string) 
    update_attributes(Hash[[:first_name,:last_name].zip(name_string.strip.split(' ', 2))]) 
end 

Который будет работать save с и вернуться true или false, основанный на справедливости

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