Brian Hicks
Brian Hicks

Reputation: 6403

Undefined method `reflect_on_association` using Mongoid, Rspec

I'm learning me some Rails! But right now, I can't seem to get past an error RSpec is throwing. The error is as follows:

  1) EntryMethodsController POST create with valid params creates a new EntryMethod
     Failure/Error: post :create,
     NoMethodError:
       undefined method `reflect_on_association' for "4e94ca4f66472f02ff00000a":String
     # ./app/controllers/entry_methods_controller.rb:43:in `create'
     # ./spec/controllers/entry_methods_controller_spec.rb:48:in `block (4 levels) in '

Finished in 0.29409 seconds
13 examples, 1 failure

Failed examples:

rspec ./spec/controllers/entry_methods_controller_spec.rb:47 # EntryMethodsController POST create with valid params creates a new EntryMethod
Done.

Test

  describe "POST create" do
    describe "with valid params" do
      before :each do
        @contest = FactoryGirl.create(:contest)
      end

      after :each do
        @contest.destroy
      end

      it "creates a new EntryMethod" do
        expect {
          post :create,
               :contest => @contest,
               :entry_method => FactoryGirl.attributes_for(:url_entry_method, :contest => @contest)
        }.to change(@contest.entry_methods, :count).by(1)
      end
   end
 end

Controller

def create
  @entry_method = Contest.find(params[:contest_id])
                  .entry_methods.new(params[:entry_method])

  respond_to do |format|
    if @entry_method.save
      format.html { redirect_to @entry_method, notice: 'Entry method was successfully created.' }
      format.json { render json: @entry_method, status: :created, location: @entry_method }
    else
      format.html { render action: "new" }
      format.json { render json: @entry_method.errors, status: :unprocessable_entity }
    end
  end
end

Models

class Contest
  include Mongoid::Document
  include Mongoid::Timestamps
  field :name, :type => String
  field :rules, :type => String
  field :start_date, :type => Time
  field :end_date, :type => Time

  embeds_many :entry_methods
end

class EntryMethod
  include Mongoid::Document
  field :url, :type => String
  field :string, :type => String

  embedded_in :contest
end

Thanks, SO awesome people. :)

Upvotes: 1

Views: 3417

Answers (1)

Ryan Bigg
Ryan Bigg

Reputation: 107718

I reckon this is because you're passing through a full @contest object to the parameters of the create action, when it's actually going to be expecting a Hash of attributes.

You can fix this by changing your call to that action to this:

post :create,
     :contest => @contest.attributes,
     ...

I would also not get FactoryGirl to create the object for you, as that may lead to uniqueness validations or whatever possibly failing. You should be using FactoryGirl.build, and not FactoryGirl.create.

Upvotes: 2

Related Questions