Rendering different views for a given action

Hi, everyone, this is my first post here!

I have a “HomeController” that has an “index” method.

I have 4 views for this method:

  • index.html.erb
  • index.mobile_lofi.erb
  • index.mobile_hifi.erb
  • index.iphone.erb

I also have the following mimetypes defined:
Mime::Type.register_alias “text/html”, :mobile_lofi
Mime::Type.register_alias “text/html”, :mobile_hifi
Mime::Type.register_alias “text/html”, :iphone

Now, the content (instance variables) these views need is almost the
same among them.

I have a method “device_type?” that returns one of the [:html,
:mobile_lofi, :mobile_hifi, :iphone] based on the User-Agent string.

How do I render the view based on the result of the “device_type?”
method?
I am using Rails 2.3.3.

Thank you,
Gleb

Gleb M. wrote:

Hi, everyone, this is my first post here!

I have a “HomeController” that has an “index” method.

I have 4 views for this method:

  • index.html.erb
  • index.mobile_lofi.erb
  • index.mobile_hifi.erb
  • index.iphone.erb

I also have the following mimetypes defined:
Mime::Type.register_alias “text/html”, :mobile_lofi
Mime::Type.register_alias “text/html”, :mobile_hifi
Mime::Type.register_alias “text/html”, :iphone

Now, the content (instance variables) these views need is almost the
same among them.

I have a method “device_type?” that returns one of the [:html,
:mobile_lofi, :mobile_hifi, :iphone] based on the User-Agent string.

How do I render the view based on the result of the “device_type?”
method?
I am using Rails 2.3.3.

Thank you,
Gleb

Gleb, I am not sure, but i would think along these line

def index
format = device_type?
respond_to do |format|
format.html
format.mobile_lofi { render blah}
format.iphone { render :action => blah }
end
end

Cheers

Craigslist Clone in Rails
http://www.classifiedscript.in

On Wed, Aug 19, 2009 at 1:01 AM, Rails
List[email protected] wrote:

format = device_type?
respond_to do |format|
format.html
format.mobile_lofi { render blah}
format.iphone { render :action => blah }
end
end

Close, but I think you need to set request.format, and I’d probably do
that in a before filter.

class HomeController < ApplicationController
before_filter :set_device_mime_type

 def set_device_mime_type
     request.format = device_type?
 end

 def index
     respond_to do |format|
         #what you said
     end
end

end

I’d also strongly suggest renaming that device_type? method to
something like device_mime_type since the question mark indicates that
it should be a predicate method.

It might also be a good idea to refactor this a bit so that you only
change the format of the request if it is coming from one of the
special devices, and leave it to what the client sent otherwise.

–
Rick DeNatale

Blog: http://talklikeaduck.denhaven2.com/
Twitter: http://twitter.com/RickDeNatale
WWR: http://www.workingwithrails.com/person/9021-rick-denatale
LinkedIn: http://www.linkedin.com/in/rickdenatale

Thanks a lot, Rick!