Как присвоить значение в объекте RoR?
-
23-09-2019 - |
Вопрос
У меня есть объект 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)
если у вас хорошо налажены отношения