Ruby on Rails Monday, November 28, 2011

On Mon, Nov 28, 2011 at 5:19 PM, Walter Lee Davis <waltd@wdstudio.com> wrote:
>
> On Nov 28, 2011, at 10:07 AM, Sebastian wrote:
>
>> On Mon, Nov 28, 2011 at 9:30 AM, Michael Pavling <pavling@gmail.com> wrote:
>>> On 28 November 2011 02:27, Seb <sebastianthegreatful@gmail.com> wrote:
>>>> The phone model consists of id, name, version, imei, etc. id is the primary
>>>> key as by the rails standard.
>>>> imei is unique but not the primary key. when I update the model from the
>>>> android app I dont have the id, only the imei number.
>>>> The way I see it I have 3 options.
>>>> 1. create an action called update_version, do a find_by_imei and update my
>>>> model. This is actually what I do now but this isnt very restful or pretty
>>>
>>> Why is this not pretty or RESTful? Is that because you're doing it in
>>> the same controller as your "normal" updates that have id?
>>
>> Yes, and just because I did it in a odd way... I'm new to rails.
>>
>>> If so, have a separate controller for the mobile app to access by
>>> IMEI, and mixin any functionality that's shared (or subclass and
>>> overload the population of @phone depending on whether it's .find or
>>> .find_by_imei)
>>>
>>>> 2. During create assign imei to phone.id... I like this solution for it's
>>>> simplicity, but I cant get it to work (for reasons I'll explain if
>>>> requested)
>>>
>>> As suggested by Norbert, it would be easier to make the IMEI field the
>>> primary key.
>>>
>>
>> Yeah, and right now I'm leaning towards that way.
>>
>>>> 3. make two requests to the server. 1. where I do a find_by_imei and return
>>>> the id 2. update normally
>>>
>>> This might be easiest... but I'd be keen to see the controller code
>>> you're using at the moment, because I assume you're doing something
>>> like this:
>>>   @phone = Phone.find(params[:id])
>>>
>>> and you *might* be able to change that to :
>>>   @phone = Phone.find_by_id(params[:id]) || Phone.find_by_imei(params[:imei])
>>>
>>> (or DRY it up to a method:
>>>   @phone = find_phone_from_params
>>>
>>>  private
>>>  def find_phone_from_params
>>>    Phone.find_by_id(params[:id]) || Phone.find_by_imei(params[:imei])
>>>  end
>>> )
>>>
>>
>> The problem with this is that the update action is invoked by posting
>> to /phones/id. And I dont have that id when posting.
>> If i simply post to /phones the create method will be invoked, right?
>
> When you're posting from the phone, you DO have the IMEI, right? Your phone-specific controller can know this, and use the following pattern:
>

I sure do.

>  def update
>    @phone = Phone.find_by_imei(params[:id])
>    @phone.update_attributes(params[:phone])
>    ...
>  end
>
> Just substitute the imei for the id in your form_for tag, and Bob's your uncle.
>

How would I go about that?

--
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group.
To post to this group, send email to rubyonrails-talk@googlegroups.com.
To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.

No comments:

Post a Comment