Как присвоить значение в объекте RoR? - PullRequest
0 голосов
/ 27 января 2010

У меня есть объект заказа, у которого есть метод создания, подобный этому:

 def create
    @order                           = Order.new(params[:order])
    # @order.status_id = "1"

    respond_to do |format|
      if @order.save
        flash[:notice]               = 'Order was successfully created.'
        format.html { redirect_to(@order) }
        format.xml  { render :xml    => @order, :status => :created, :location => @order }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml    => @order.errors, :status => :unprocessable_entity }
      end
    end
  end

Я хочу установить @order status_id на "1", поэтому у меня есть

 @order.status_id = "1" 

Но этот код не работает, после того как я раскомментировал его, он по-прежнему не может сохранить «1» в status_id в db, но другой атрибут может успешно сохранить.

order.rb

class Order < ActiveRecord::Base
  has_many :order_items
  belongs_to :status

end

Ответы [ 4 ]

3 голосов
/ 27 января 2010

Вы должны иметь возможность присвоить строковое значение ключу отношения, и он будет преобразован по мере необходимости. Параметры всегда представляются в виде строк, поэтому, очевидно, это должно происходить, чтобы что-то работало.

Это такая ситуация, когда надежный модульный тест поможет сузить масштаб проблемы. Это может быть один из:

  • Существует атрибут attr_accessor, определенный для status_id, который блокирует назначение.
  • Определен метод status_id =, который блокирует назначение.
  • Status_id сбрасывается во время вызова before_validation или before_save.

Вы хотели бы создать подпрограмму тестирования, которая проверяет это:

def test_status_assignment
  order = Order.new

  order.status_id = '1'

  order.save

  assert_equal 1, order.status_id
end
1 голос
/ 27 января 2010

Изменить @order.status_id = "1" на @order.status_id = 1

Ruby может читать "1" в виде строки (что предполагается сделать) вместо целого числа (что вы, вероятно, ищете) Когда вы удаляете кавычки, ruby ​​будет интерпретировать его как целое число. Если вы должны оставить это как строку, попробуйте что-то вроде my_string.to_i или "123".to_i.

Если это не сработает, пожалуйста, опубликуйте полученное сообщение об ошибке.

1 голос
/ 27 января 2010

Это

@order.status_id = "1"

должно быть

@order.status_id = 1

Или, может быть

@order.status = Status.find_by_id(1)

если у вас хорошие отношения

1 голос
/ 27 января 2010

В вашей модели может быть attr_accessible, блокирующее назначение этого поля. Это делается с помощью белого списка утвержденных полей.

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