Вопрос

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

 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, но другой атрибут может успешно сохраниться.

порядок.rb

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

end
Это было полезно?

Решение

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

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

  • Для status_id определен attr_accessor, который блокирует присвоение.
  • Определен метод 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

Другие советы

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

Изменение @order.status_id = "1" Для @order.status_id = 1

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

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

Это

@order.status_id = "1"

должно быть

@order.status_id = 1

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

@order.status = Status.find_by_id(1)

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top