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
War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top