Rails обновляет атрибуты пользовательской модели из OrdersController - PullRequest
3 голосов
/ 08 апреля 2011

Этот мой код:

class 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 столбец вМодель пользователя.Разве невозможно обновить атрибут модели User с объекта, который не является UsersController?

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

Спасибо

ОБНОВЛЕНИЕ: С помощью приведенных ниже людей я смог проверить две вещи: 1. result = 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: Пользовательская модель

требуется 'digest'

Класс User

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

end end

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

1 Ответ

3 голосов
/ 08 апреля 2011

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

  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.

...