passage de paramètres à la poste :créer une demande ruby-on-rails-3.1, Rspec, usine-fille
Je suis en train d'écrire un contrôleur de spécifications pour la création d'un achat avec un achat en ligne. L'achat est créé très bien avec tous les attributs que je lui donner, mais l'achat de la ligne de l'élément n'est pas créé. Voici mon code:
usines.rb
FactoryGirl.define do
factory :purchase do |f|
f.sequence(:po_number) { |n| "0000-00#{n}" }
f.sequence(:ship_to) { |n| "Test Corp#{n}"}
f.sequence(:ship_via) {|n| "Test Delivery#{n}" }
f.sequence(:terms) {|n| "My terms#{n}" }
f.sequence(:qa_requirements) {|n| "Requirment#{n}" }
f.sequence(:justification) {|n| "Justification#{n}" }
f.become_part_of_delivered_product true
f.immediately_delivered_to_stc_client false
f.remain_for_contract_at_stc_as_gov_prop false
f.consumed_in_job_requirements true
f.used_in_repair_of_gov_prop false
f.is_gov_prop_in_possession_of_stc false
f.sequence(:required) {|n| "2011-10-0#{n}" }
f.prd_number_id { |n| n.association(:prd_number).id }
# f.order_for_id { |o| o.association(:user) }
f.submitted_by_id { |s| s.association(:submitted_by).id }
# f.ordered_for_date { Time.now.to_s }
f.submitted_by_date { Time.now.to_s }
f.quality_system_classification_id { |q| q.association(:quality_system_classification).id }
f.after_create { |c| Factory(:purchase_line_item, purchase: c) }
end
factory :purchase_line_item do |f|
f.sequence(:item_description) {|n| "Desc#{n}" }
f.unit_price "100.00"
f.qty "40"
f.sequence(:charge_number) {|n| "000-00#{n}" }
end
end
PurchaseLineItem.rb
belongs_to :purchase
validates_presence_of :item_description,
:unit_price,
:qty,
:charge_number
Achat.rb
belongs_to :authorized_signers
belongs_to :vendor
belongs_to :purchase_type
belongs_to :quality_system_classfication
belongs_to :order_by, :class_name => "User", :foreign_key => "order_by_id"
belongs_to :submitted_by, :class_name => "User", :foreign_key => "submitted_by_id"
belongs_to :approved_by, :class_name => "User", :foreign_key => "approved_by_id"
belongs_to :purchased_by, :class_name => "User", :foreign_key => "purchased_by_id"
has_many :purchase_line_items
has_many :audits
accepts_nested_attributes_for :purchase_line_items, :allow_destroy => true
validates_presence_of :required,
:ship_to,
:ship_via,
:terms,
:quality_system_classification_id,
:prd_number_id
Achat Contrôleur De
load_and_authorize_resource
def new
@purchase = Purchase.new
1.times { @purchase.purchase_line_items.build }
end
def create
@purchase = Purchase.new(params[:purchase])
@purchase.without_auditing do
if @purchase.save
flash[:notice] = "Successfully created purchase."
redirect_to @purchase
else
render action: 'new'
end
end
end
PurchaseController spec
require 'spec_helper'
describe PurchasesController do
login_user
describe "POST create" do
before(:each) do
@ability.can :create, Purchase
end
it "should pass the params to purchase" do
purchase = Factory(:purchase)
post :create, purchase: purchase.attributes.except("id")
assigns(:purchase).po_number.should == purchase.po_number
end
it "should pass the params to purchase_line_items" do
purchase = Factory(:purchase)
post :create, purchase: purchase.attributes, purchase_line_items_attributes: purchase.purchase_line_items.first.attributes
assigns(:purchase).purchase_line_items.first.unit_price.should == purchase.unit_price
end
end
end
Merci d'avance
OriginalL'auteur brink | 2011-10-25
Vous devez vous connecter pour publier un commentaire.
Rails 4, cette généralité n'a pas fonctionné pour moi:
Ce qui suit est un style généralisé que j'ai découvert de satisfaire le poste :créer ...mise à jour pour les Rails 4. Remarque: Le valid_session peut ne pas fonctionner exactement comme je me suis cogner, mais vous obtenez le SEC idée 😉
Dans les Rails 4, si vous configurez le contrôleur à utiliser:
et la suppression de la
attr_accessible
à partir des modèles, alors vous n'avez pas à vous soucier d'utiliser leattributes.except(...)
de filtre.Merci!!!! Votre
valid_session
modèle est très utile et élégant solution pour les Rails 4 contrôleurs qui ont cancan autorisations.Les travaux de cette. Nous pouvons également créer manuellement les paramètres en faisant
parameters = ActionController::Parameters.new
et ensuite faire toutes les opérations inscrites dans l'API. Nous avons à.require(:purchase).permit!
et de passer les paramètres que 2 séparés des objets, par ex.def purchase_params params.require(:purchase).permit(...) end
et puis les autres paramètres. api.rubyonrails.org/classes/ActionController/...OriginalL'auteur Eric Wanchic
Pensé à elle. - Je changer certaines choses mais le problème est que la syntaxe. Dans le PurchasesController Spec j'ai changé le code pour:
La syntaxe est nécessaire d'être modifié à partir de:
:
Maintenant tout fonctionne!
OriginalL'auteur brink