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!

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs