Ruby on Rails: приравнивание предметов в контроллерах (или, может быть, моделях?) - PullRequest
0 голосов
/ 12 октября 2009

Я пытаюсь сделать атрибуты равными предопределенным значениям, и я не уверен, что я делаю это эффективно со следующим (в моем контроллере заказов):

def create
  @order = Order.find(params[:id])
  @order.price = 5.99
  @order.representative = Product.find(params[:product_id]).representative
  @order.shipping_location = SHIPPING_LOCATION
  @order.user = current_user

  respond_to do |format|
   ...
  end
end

Есть ли более эффективный способ приравнять атрибуты в Rails (возможно, с использованием моделей)? Если я использую два разных контроллера, могу ли я просто повторить то, что я сделал выше для нового контроллера?

Ответы [ 3 ]

3 голосов
/ 12 октября 2009

Ваш код немного отключен, он выглядит как действие контроллера для создания, но код читается так, как будто для обновления.

Вне зависимости от ... Вы можете использовать хэш параметра, чтобы обновить все сразу.

В случае, если вы создаете:

order_update = {:price => 5.99, :representative => 
  Product.find(params[:product_id]).representative, 
  :shipping_location => SHIPPING_LOCATION,
  :user => current_user}

@order = Order.new(order_update)

В случае обновления:

@order.update_attributes(order_update) #attempts to save.

Смешивая его с кодом вашего контроллера, мы получаем:

def create
  @order = Order.find(params[:id])
  order_update = {:price => 5.99, :representative => 
    Product.find(params[:product_id]).representative, 
    :shipping_location => SHIPPING_LOCATION,
    :user => current_user}    

  respond_to do |format|
    if @order.update_attributes(order_update)
      # save succeeded. Redirect.
    else
      # save failed. Render with errors. 
    end
  end
end
3 голосов
/ 12 октября 2009

Используйте функцию обратного вызова before_create в модели для назначения значений по умолчанию.

0 голосов
/ 12 октября 2009

Другое решение:

class Example < ActiveRecord::Base
  DEFAULTS = HashWithIndifferentAccess.new(:some => 'default', :values => 'here')

  def initialize(params = {})
    super(DEFAULTS.merge(params))
  end
end

Либо используйте инициализацию и слияние с параметрами, либо используйте хук ActiveRecord, как before_create и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...