Forum: Ruby on Rails Code Cleaning

Posted by Christophe (Guest)
on 2010-03-09 14:01
(Received via mailing list)
Hi there,

I'm kind of a newbie on RoR and on this group and I was wondering if
someone could help to clean this bit of code:

<%= link_to_remote (image_tag("hide.png", :size=>"16x16"),
            :url=>"/message/#{message.id}/hide",
            :method=>"post",
            :before=>"Effect.Fade(this.parentNode.parentNode, {duration:
0.5});
                Effect.BlindUp(this.parentNode.parentNode, {duration: 
0.5})")
%>
<%= link_to_remote (image_tag("top.png", :size=>"16x16"),
            :url=>"/message/#{message.id}/top",
            :method=>"post",
            :before=>"Effect.Fade(this.parentNode.parentNode, {duration:
0.5});
                Effect.BlindUp(this.parentNode.parentNode, {duration: 
0.5})")
%>
<%= link_to_remote (image_tag("bottom.png", :size=>"16x16"),
            :url=>"/message/#{message.id}/bottom",
            :method=>"post",
            :before=>"Effect.Fade(this.parentNode.parentNode, {duration:
0.5});
                Effect.BlindUp(this.parentNode.parentNode, {duration: 
0.5})")
%>

As you can see I have some kind of options that do repeat themselves.
My idea was to find a way to describe them for once and use them
repeatedly.
Any thoughts on how to achieve this,

Thanks in advance,

Christophe
Posted by Andy Jeffries (Guest)
on 2010-03-09 14:19
(Received via mailing list)
>
> I'm kind of a newbie on RoR and on this group and I was wondering if
> someone could help to clean this bit of code:
>

How about something as simple as:

<% for image_filename in ["hide.png", "top.png", "bottom.png"] %>
  <%= link_to_remote (image_tag(image_filename, :size=>"16x16"),
                                               :url=>"/message/#{message.id
}/hide",
                                               :method=>"post",

 :before=>"Effect.Fade(this.parentNode.parentNode, {duration:
0.5});

 Effect.BlindUp(this.parentNode.parentNode, {duration: 0.5})")
%>
<% end %>

Alternatively, make a helper method and call that each time.

Cheers,


Andy
Posted by Christophe Decaux (Guest)
on 2010-03-09 14:32
(Received via mailing list)
Thanks,
That's a good start.

Any advice where to start looking for how to make a helper method ?
Posted by Andy Jeffries (Guest)
on 2010-03-09 15:10
(Received via mailing list)
On 9 March 2010 13:30, Christophe Decaux 
<christophe.decaux@gmail.com>wrote:

> Thanks,
> That's a good start.
>
> Any advice where to start looking for how to make a helper method ?
>

I'd recommend Agile Web Development with Rails (Pragmatic Programmers 
book).
 I looked online but couldn't see a lot that was easy to learn from.

Basically a helper method is a method that is available in your views 
and
(can be) used for generating markup that would be repetitive otherwise.

For example you could have something this:

application_helper.rb:
module ApplicationHelper
  def christophe_link_action(image_filename)
    link_to_remote (image_tag(image_filename, :size=>"16x16"),

                                               :url=>"/message/#{message.id
}/hide",
                                               :method=>"post",

 :before=>"Effect.Fade(this.parentNode.parentNode, {duration:
0.5});

 Effect.BlindUp(this.parentNode.parentNode, {duration: 0.5})")

   end
end

Then in your view just do:

<%= christophe_link_action("foo.png") %>
<%= christophe_link_action("bar.png") %>

Does that make things any clearer?  If not, I'd recommend the book I
mentioned earlier (or post back with questions).

Cheers,


Andy
Posted by Peter Hickman (Guest)
on 2010-03-09 15:21
(Received via mailing list)
Only thing to note it that the :url parameter changes on each line (it 
does
not always end with 'hide'!)

The fact that it is the same as the image name should be treated as an
unfortunate coincidence. The christophe_link_action() method should take 
two
parameters, one for the image file name and one for the url (or at least 
the
last part of it).
Posted by Christophe Decaux (Guest)
on 2010-03-09 15:24
(Received via mailing list)
Thanks,
This is good concise explanation.
I do have the book you suggests, but haven't had the time to go deep 
enough in it.
Furthermore, I went back to it to check what it says about helper 
creation, but didn't quite understood

Cheers,
Christophe
Le 9 mars 2010 à 15:08, Andy Jeffries a écrit :
Posted by Andy Jeffries (Guest)
on 2010-03-09 16:04
(Received via mailing list)
Agreed.  I didn't notice that in the OP's code.

Cheers,


Andy

--
Andy Jeffries
http://andyjeffries.co.uk/      #rubyonrails #mysql #jquery
Registered address: 64 Sish Lane, Stevenage, Herts, SG1 3LS
Company number: 5452840
Posted by Marnen Laibow-Koser (marnen)
on 2010-03-09 18:36
Christophe wrote:
> Hi there,
> 
> I'm kind of a newbie on RoR and on this group and I was wondering if
> someone could help to clean this bit of code:
> 
> <%= link_to_remote (image_tag("hide.png", :size=>"16x16"),
>             :url=>"/message/#{message.id}/hide",
>             :method=>"post",
>             :before=>"Effect.Fade(this.parentNode.parentNode, {duration:
> 0.5});
>                 Effect.BlindUp(this.parentNode.parentNode, {duration: 
> 0.5})")
> %>
> <%= link_to_remote (image_tag("top.png", :size=>"16x16"),
>             :url=>"/message/#{message.id}/top",
>             :method=>"post",
>             :before=>"Effect.Fade(this.parentNode.parentNode, {duration:
> 0.5});
>                 Effect.BlindUp(this.parentNode.parentNode, {duration: 
> 0.5})")
> %>
> <%= link_to_remote (image_tag("bottom.png", :size=>"16x16"),
>             :url=>"/message/#{message.id}/bottom",
>             :method=>"post",
>             :before=>"Effect.Fade(this.parentNode.parentNode, {duration:
> 0.5});
>                 Effect.BlindUp(this.parentNode.parentNode, {duration: 
> 0.5})")
> %>
> 
> As you can see I have some kind of options that do repeat themselves.
> My idea was to find a way to describe them for once and use them
> repeatedly.
> Any thoughts on how to achieve this,

Well, one thing to do: take the JavaScript out of your ERb files and put 
it in a separate JavaScript file.  This has many advantages, among them 
the fact that it's easier to reduce repetition.

> 
> Thanks in advance,
> 
> Christophe

Best,
--
Marnen Laibow-Koser
http://www.marnen.org
marnen@marnen.org
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.