"s.ross" <[EMAIL PROTECTED]> writes:

> In Rails, the primary key, by default 'id', is used all over the
> place. However, Ruby now deprecates the use of constructs like:
>
> @post = Post.find(:first)
> @post_id = @post.id
>
> I buy the rationale, as the Object#id is something of a reserved
> method. However, changing all references to use [:id], while seemingly
> the correct approach, also has the unwanted side-effect of breaking
> every mock created using mock_model that references the id that way.
>
> Sure, I can go in and stub [] to return self[:id] for each mock
> object, but that ActiveRecord objects behave more as a hash than as an
> object (IMO), so there are things like:
>
> @post[:body_text]
>
> peppered throughout the codebase, and a big hammer like a stub of the
> []() method would also break specs. So the conundrum is how to make
> mock_model respond only to the []() method with an argument of :id to
> return self[:id].
>
> Questions:
>
> 1. Is there something bogus in my assumption that using @post[:id] is
> preferred to @post.id?
> 2. Has anyone solved this problem and if so what worked?
>
> BTW: I am aware that :to_param returns the id, but it seems counter-
> intuitive to read code that takes advantage of this quirk.
>
> Thanks,
>
> Steve
> _______________________________________________
> rspec-users mailing list
> [email protected]
> http://rubyforge.org/mailman/listinfo/rspec-users

I came across this today when I used stub_model.  I hadn't given it an
explicit ID so I got that warning.  So if that's why you're
encountering, just do something like
@post = stub_model(:id => 123)

As others have said though, only Object#id is deprecated.  AR::Base#id
is still valid.

Pat
_______________________________________________
rspec-users mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/rspec-users

Reply via email to