Rails обновляет атрибуты пользовательской модели из OrdersController

Это мой код:

класс OrdersController

def create
  @order = Order.new(params[:order])
    if @order.purchase
      work = GATEWAY.store(credit_card, options)
      result = work.params['billingid']
      current_user.update_attributes(:billing_id => result)
    end
  end
end

billingid возвращается при запуске GATEWAY.store(credit_card, options) Я пытаюсь сохранить это возвращенное billingid в столбце :billing_id в модели пользователя. Нельзя ли обновить атрибут модели пользователя из объекта, отличного от UsersController?

Проще говоря, нельзя ли обновить атрибут модели №1 с контроллера модели №2?

Спасибо

ОБНОВЛЕНИЕ: с помощью приведенных ниже мужчин я смог проверить две вещи: 1. результат = work.params ['billingid'] возвращает строку 2. Я могу сохранить в другой модели с любого контроллера

Однако, несмотря на то, что у меня есть attr_accessible :billing_id, я все еще не могу сохранить результат в столбце billing_id таблицы User. Мне удалось сохранить результат в столбце store_name таблицы Store, поэтому я не знаю, что именно в модели пользователя мешает мне сохранить.

я побежал,

@mystore = Store.find(current_user)
@mystore.store_name = result            
@mystore.save

и это было успешно. Но,

@thisuser = User.find(current_user)
@thisuser.billing_id = result
@thisuser.save

Это не удается, даже если атрибут attr_accessible установлен правильно. Что еще может помешать сохранить определенные атрибуты, кроме attr_accessible? Всем спасибо!

ОБНОВЛЕНИЕ 2: Модель пользователя

требуется «дайджест»

класс Пользователь ‹ ActiveRecord::Base

has_one :store
has_many :products
attr_accessor :password
# attr_accessible was commented out completely just to check as well. Neither worked
attr_accessible :name, :email, :password, :password_confirmation, :username, :billing_id
validates :name,  :presence => true,
                :length   => { :maximum => 50 }

validates :email, :presence => true,
                :format   => { :with => email_regex },
                :uniqueness => { :case_sensitive => false } 
validates :password, :presence     => true,
                   :confirmation => true,
                   :length       => { :within => 6..40 } 

username_regex = /^([a-zA-Z0-9]{1,15})$/

before_save :encrypt_password

def has_password?(submitted_password)
    encrypted_password == encrypt(submitted_password)
end
private
def encrypt_password
  self.salt = make_salt if new_record?
  self.encrypted_password = encrypt(password)
end

def encrypt(string)
  secure_hash("#{salt}--#{string}")
end

def make_salt
  secure_hash("#{Time.now.utc}--#{password}")
end

def secure_hash(string)
  Digest::SHA2.hexdigest(string)
end

конец конец

ОБНОВЛЕНИЕ: РЕШЕНИЕ, используя @thisusers.errors, я смог узнать, что он пытался проверить наличие пароля во время этого запроса. Как только я это прокомментировал, он сохранился без проблем. Я не уверен, почему это происходит, но я возьму это отсюда. Всем спасибо спец. дмарков!


person railslearner    schedule 08.04.2011    source источник
comment
Контроллеры — это всего лишь способ организации функциональности вашего приложения, и вы можете работать с любыми моделями, какими захотите, в любых контроллерах, какие захотите. Показанный выше код выглядит нормально, если предположить, что current_user — это доступный метод, который возвращает экземпляр модели с атрибутом billing_id (предположительно User).   -  person Steve Jorgensen    schedule 08.04.2011


Ответы (1)


Не должно быть проблем с обновлением любого количества моделей с контроллера.

  1. Убедитесь, что work.params['billingid'] действительно содержит значение.

  2. Ваша модель User может иметь некоторые атрибуты, помеченные как attr_accessible (поскольку у вас есть current_user, я предполагаю, что у вас есть аутентификация, и это часто означает необходимость защиты атрибутов вашей модели по умолчанию). Если это так, это означает, что только эти атрибуты могут быть изменены путем массового присвоения (например, с помощью update_attributes). Либо добавьте billing_id в список атрибутов, которые являются attr_accessible, либо не используйте массовое присвоение. (Вместо этого вы бы просто сделали current_user.billing_id = result, а затем current_user.save)

Изменить: проблема оказалась ошибкой проверки модели User. Всегда проверяйте user.errors, когда user.save возвращает false.

person Dylan Markow    schedule 08.04.2011
comment
Привет, dmarkow, я смог проверить обе эти вещи. У меня был attr_accessible :billing_id, и я даже пробовал без attr_accessible. Я попытался сохранить его в столбце store_name модели Store, и он действительно был сохранен! Но я пытаюсь сохранить его в столбце billing_id модели User, и это просто не сработает. Можете ли вы придумать какие-либо другие причины, по которым он не будет сохранен в определенной модели, кроме attr_accessible? Спасибо - person railslearner; 08.04.2011
comment
Почему вы принимаете ответ, если ваша проблема еще не решена? Я думаю, что dmarkow прав... покажите нам свой код модели пользователя. - person Mischa; 08.04.2011
comment
Так действительно ли строка @thisuser.save не работает (то есть возвращает false)? - person Dylan Markow; 08.04.2011
comment
Да, эта строка не работает и возвращает false. @mystore.save возвращает истину - person railslearner; 08.04.2011
comment
Поэтому, если он возвращает false, следующим шагом будет просмотр @thisuser.errors и выяснение того, что вызывает его сбой. Вероятно, это одна из ваших проверок. - person Dylan Markow; 08.04.2011
comment
Спасибо, dmarkow! Я не думал об использовании @thisuser.errors. По какой-то причине возникла проблема с проверкой пароля. Я не уверен, почему это произошло, но как только я закомментировал валидацию :password, она была сохранена! Большое спасибо всем! - person railslearner; 08.04.2011