Squeegy Fleximage Routing

Hello people,

I’m using squeegy fleximage for my site right now and having some
difficulty to achieve some things. Updates photos are saved in created
at date generated fom like : ’ /images/2008/05/14/22.png ’ . However
this route is not accessible through the browser and I don’t know how
to add it in my routes.rb knowing that the dates will change everyday.
However there’s a way to avoid these kind of generated paths and use
only a flat form by using a rake task (

  • Bottom page ) .

rake fleximage:convert:to_flat FLEXIMAGE_CLASS=Photo

And actually, I’m having the following error from console :

** Invoke fleximage:convert:to_flat (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute fleximage:convert:to_flat
rake aborted!
You have a nil object when you didn’t expect it!
The error occurred while evaluating nil.year

Anyone knows how to solve this ?

Regards,

Joel

I am using fleximage, and having no problem with it.

I think you must be using it incorrectly. Those date paths are how it
stores the master image. You should not be rendering from those. You
render using their special templates called from special formats in
your controller.

The rake tasks are for one time jobs during development.

Try reading their instructions and examples more carefully and see if
you can figure it out.

–Will

Indeed I was using it wrongly ! But the real problem is as described
below, in fact it concerns the rendering of the image.

My controller action code looks like this :

      def showimg
            @promo = Promotion.find(params[:id])
            respond_to do |format|
                    # format.png  { image_tag

@promo.file_path(@promo) }
format.html { render :inline =>
@promo.operate {|p| p.resize
‘30x30’}”, :type => :flexi }
# format.xml { render :xml => @promo }
end
end

I’m using the following code in my view ;

    <div>
            <%=

render_component(:controller=>‘promotions’,:action=>‘showimg’,:id=>promotion.id)
%>

And this view actually doesn’t correspond to the correponding view of
the above controller action code.The url corresponding to the above
controller action however displays very well my image, but I’m having
very much difficulty to display it in this view.
Instead of having my image, i’m having some binary data, quite a messy
thing. I’m asking myself whether this doesn’t have to do with the
respond_to format.

I tried using the render instead of render_component but didn’t work.

Does this tell you something ?

Joel

Understand,

but I tried the send_data method with no result. What I don’t
understand is why the url corresponding to controller action works and
not the rendering of the image. In both cases the specified type is
flexi, so why it works in the 1st case and not the second ?

On 16 May 2008, at 14:21, joel wrote:

thing. I’m asking myself whether this doesn’t have to do with the
respond_to format.

It does and it doesn’t. You don’t need to render an image_tag, you
need to render the binary data itself with the correct headers
defined, so that your browser recognizes it as being a png image.

Something like this probably works:
respond_to do |format|
format.png { send_data(@promo.file_path(@promo), :type=>“image/
png”, :disposition =>“inline”) }
end

Best regards

Peter De Berdt

My first question is: which view?
This whole thing you’ve got seems really complicated. As far as I
understand flexi really wants to use a .flexi file to do its rendering.
So you should have a showimg.png.flexi file in your view directory. Your
controller action can be really simple. Something like this (this one of
mine):

def thumbnail
@photo = Photo.find(params[:id])
respond_to do |format|
format.jpg
end
end

Then you just let rails magic handle the rendering.

One thing that took me a little while to figure out was that the
rendering of the image is actually a separate http call. That is, the
image itself has its own trip through the routes/controller/view
mechanism. So when the image is being rendered, it is all that is
being rendered, and it is the flexi file that does the view part.

One more thing, I found my life got easier when I started using separate
names for different types of images. To show the information about a
photo, I use:

GET /photos/1

GET /photos/1.xml

def show
@photo = Photo.find(params[:id])
respond_to do |format|
format.html if # show.html.erb
format.xml { render :xml => @photo }
end
end

But to show the actual photo I use the action above. To make this work I
also add a few routes:
map.resources :photos
map.thumbnail ‘/photos/normal/:id.:format’, :controller => “photos”,
:action => “normal”
map.thumbnail ‘/photos/thumb/:id.:format’, :controller => “photos”,
:action => “thumbnail”
map.fullsize ‘/photos/fullsize/:id.:format’, :controller => “photos”,
:action => “fullsize”

Hope all of this helps.

–Will

Joel,

Instead of using render_component, just use image_tag and let rails do
the work. I think your trying too hard.

Heres one from my site:

<%= image_tag(thumbnail_path(photo, :jpg), :height => “100”, :alt =>
photo.alt, :title => photo.title) %>

– Will

Hi,

thank you very much for all these explanations that I found out to be
very useful. However I think the problem is really due to calling the
action method from another view. Actually I have the following code in
my view when trying to render the image.

<% for promotion in @promotion %>
<div’>
<%=
render_component :controller=>‘promotions’,
:action=>‘showimg’,:id=>promotion.id
%>

<% end %>

The following works very well :
http://0.0.0.0:3000/promotions/showimg/23

Controller action code looks like this : (very simple and basic)

      def showimg
@promo = Promotion.find(params[:id])
respond_to do |format|
  #format.html
  format.png
end
 end

But then I need to call this action from another view and render the
actual image; but I have binary data instead of a beautiful picture.

Joel

Yep, indeed I was trying too hard !

Got the problem solved now, thank you very much :wink: Indeed it was
quite a simple task.

However I have another issue concerning fleximage. Is it possible to
“attach” two different images to a single record and rendering the
both of them. For my case, I need to be able to store one image for my
promotion item and a second that would be a logo of the item’s brand.

Help for your precious help.

Best Regards,

Joel

Joel,

This actually has nothing to do with fleximage. How are you “attaching”
the first image? Just do that twice.

Probably what you want is a one to many relationship. Some kind of
has_many model. Just link in the images you need and then just generate
an image tag for each.

– Will