Wie Wert in einem RoR Objekt zuweisen?
-
23-09-2019 - |
Frage
Ich habe ein Objekt um, das ein Verfahren wie diese schaffen hat:
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
Ich will auf "1" den @order status_id setzen, so dass ich die
@order.status_id = "1"
Aber dieser Code ist nicht Arbeit, nachdem ich Kommentar- es, es kann immer noch nicht speichern „1“ in dem status_id in db, aber auch anderem Attribute kann erfolgreich speichern.
order.rb
class Order < ActiveRecord::Base
has_many :order_items
belongs_to :status
end
Lösung
Es soll möglich sein, einen String-Wert eine Beziehung Taste zuweisen und es wird je nach Bedarf umgewandelt werden. Die params immer als Strings kommen, so offensichtlich diese Bedürfnisse für alles auftritt, zu arbeiten.
Dies ist die Art von Situation, wo ein robuste Einheit Test schmal des Problems auf den Umfang helfen würde. Es kann eines der folgenden:
- Es ist ein attr_accessor für status_id definiert, die die Zuordnung blockiert.
- Es ist ein status_id = Verfahren definiert, welches die Zuordnung blockiert.
- Die status_id wird zurückgesetzt während eines before_validation oder BEFORE_SAVE Anruf.
Sie würden wollen eine Testroutine, dass überprüft diese Werke schaffen:
def test_status_assignment
order = Order.new
order.status_id = '1'
order.save
assert_equal 1, order.status_id
end
Andere Tipps
könnten Sie haben attr_accessible
in Ihrem Modell auf dieses Feld Sie die Zuordnung zu blockieren. Es tut dies durch eine weiße Liste der zugelassenen Felder verwendet wird.
Ändern @order.status_id = "1"
zu @order.status_id = 1
Rubin kann "1"
als String liest (was es tun soll) statt einer ganzen Zahl (was Sie wahrscheinlich suchen). Wenn Sie die Anführungszeichen entfernen Rubin wird es als eine ganze Zahl interpretieren. Wenn Sie es als String verlassen müssen, versuchen Sie so etwas wie my_string.to_i
oder "123".to_i
.
Wenn das nicht funktioniert, bitte posten, was Fehlermeldung Sie empfangen.
Das
@order.status_id = "1"
sollte
@order.status_id = 1
Vielleicht
@order.status = Status.find_by_id(1)
, wenn Sie Beziehungen schön einrichten