Forum: Ruby on Rails How to avoid bunch of <% %> ??

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
A5d8283732da86365736508fef6c1c67?d=identicon&s=25 Nuno (Guest)
on 2006-04-05 10:45
Hello, I would like to know is there is a way to avoid poluting the
views with tons of <% %> ?

Like this
<%= start_form_tag() %>
<%= text_field_tag('category[title]', category.title, {:size => 20,
:maxlength => 128}) %>
<% if not category.parent_id.nil? %>
	<%= select("category", "parent_id",
	            Category.find(:all, :conditions => [ "id <> ?",
category.id] ).collect {|c| [ c.title, c.id ] },
	            :selected => (category.parent_id.nil? ? "" :
category.parent.id)) %>
<% end %>
<%= submit_tag "Enregistrer" %>
<%= link_to "Annuler", :action => "list" %>
<%= end_form_tag() %>

Obviously this is not very clean. I find it hard to read and having to
type so many times the same symbols is tedious

Thanks
9618e8fca8d72bf01814276c53c2568c?d=identicon&s=25 Robert MannI (Guest)
on 2006-04-05 10:55
(Received via mailing list)
You can give Markaby a try:

http://code.whytheluckystiff.net/markaby
90842970ceaf7ed19136ce7b6f8e1455?d=identicon&s=25 Michael Daines (Guest)
on 2006-04-05 11:32
(Received via mailing list)
If you're using the rhtml templates, there are always going to be a
fair number of <% %> symbols to type. I use TextMate, which has
helpful key bindings for that. But some things that might help clean
things up a bit:

* Try using form_for: http://api.rubyonrails.com/classes/ActionView/
Helpers/FormHelper.html#M000384
* Try putting that select tag into a helper.

For example: (though my syntax might be incorrect as it's late)

   <% form_for :category, category do |f| %>
     <%= f.text_field :title, :size => 20, :maxlength => 128 %>
     <%= f.select :parent_id, category_selections(category) unless
category.parent_id.nil? %>

     <%= submit_tag "Enregistrer">
     <%= link_to "Annuler", :action => "list" %>
   <% end %>

And with your helpers:

   def category_selections(category)
     Category.find(:all, :conditions => ["id <> ?",
category.id]).collect {|c| [c.title, c.id]}
   end

However, that's only two fewer <% %> tags, and only because of the
way I used "unless".


-- Michael Daines
    http://www.mdaines.com
4daf0b71d5d9a3882e583c0e72eaf5dc?d=identicon&s=25 Alan Francis (Guest)
on 2006-04-05 12:09
Nuno wrote:
> Hello, I would like to know is there is a way to avoid poluting the
> views with tons of <% %> ?
>
> Like this
> <%= start_form_tag() %>
> <%= text_field_tag('category[title]', category.title, {:size => 20,
> :maxlength => 128}) %>
> <% if not category.parent_id.nil? %>
> 	<%= select("category", "parent_id",
> 	            Category.find(:all, :conditions => [ "id <> ?",
> category.id] ).collect {|c| [ c.title, c.id ] },
> 	            :selected => (category.parent_id.nil? ? "" :
> category.parent.id)) %>
> <% end %>
> <%= submit_tag "Enregistrer" %>
> <%= link_to "Annuler", :action => "list" %>
> <%= end_form_tag() %>
>
> Obviously this is not very clean. I find it hard to read and having to
> type so many times the same symbols is tedious

For the sake of clarity, I assume you're not trying to drop all the <%
markup, but are in fact looking for a way to put the whole thing inside
a single <%.

In effect, can we convert <%= %> into something like print(...) so we
can embed <%= %> inside <% %> ?

For something as complicated as above, you may find helpers useful, but
even in a simple case:

<% for blah in blahs %>
<%= blah.foo %>
<% end %>

I'd prefer to do:

<%
  for blah in blahs
     print blah.foo
  end
%>

Which would, as a side effect, facilate easy moving into a helper.

I'd like to know how to do this as well.  Anyone with any ideas ?

A.
F444e87b1967cc9cde6b48ad52fb87cd?d=identicon&s=25 Paulie (Guest)
on 2006-04-05 14:29
snip

> <%
>   for blah in blahs
>      print blah.foo
>   end
> %>
>
> Which would, as a side effect, facilate easy moving into a helper.
>
> I'd like to know how to do this as well.  Anyone with any ideas ?
>
> A.

Me too!!!!!

WOuld really clean up my RHTML, especially when there isn't much other
than ruby helper output and ruby iterators/conditions.

P
Ad7805c9fcc1f13efc6ed11251a6c4d2?d=identicon&s=25 Alex Young (Guest)
on 2006-04-05 15:17
(Received via mailing list)
Paulie wrote:
>><%
>>  for blah in blahs
>>     print blah.foo
>>  end
>>%>
<snip>
> Me too!!!!!
>
> WOuld really clean up my RHTML, especially when there isn't much other
> than ruby helper output and ruby iterators/conditions.

I'd do that as:

<%=
   blahs.collect{ |blah|
     render_blah blah
   }.join
%>
F444e87b1967cc9cde6b48ad52fb87cd?d=identicon&s=25 Paulie (Guest)
on 2006-04-06 13:03
More Like....

<div class="summat">
<%= start_form_tag()
= text_field_tag('category[title]', category.title, {:size => 20,
:maxlength => 128})
if not category.parent_id.nil?
   = select("category", "parent_id", Category.find(:all, :conditions =>
[ "id <> ?", category.id] ).collect {|c| [ c.title, c.id ] }, :selected
=> category.parent_id.nil? ? "" : category.parent.id))
end
%><h3>Some valid HTML here....</h3><%
= submit_tag "Enregistrer"
= link_to "Annuler", :action => "list"
= end_form_tag()
%></div>

If erb could interpret a lonely = sign at the start of a line in the
same way as
<%=bleh%>

P
Ad7805c9fcc1f13efc6ed11251a6c4d2?d=identicon&s=25 Alex Young (Guest)
on 2006-04-06 13:10
(Received via mailing list)
Paulie wrote:
> %><h3>Some valid HTML here....</h3><%
> = submit_tag "Enregistrer"
> = link_to "Annuler", :action => "list"
> = end_form_tag()
> %></div>
>
> If erb could interpret a lonely = sign at the start of a line in the
> same way as
> <%=bleh%>

How about a '+' at the end of a line?

<h3>Some valid HTML here....</h3><%=
submit_tag "Enregistrer" +
link_to("Annuler", :action => "list") +
end_form_tag()
%>
F444e87b1967cc9cde6b48ad52fb87cd?d=identicon&s=25 Paulie (Guest)
on 2006-04-06 17:11
Hmmmmm, never thought of that :)

P
A77873df3a9766b208e009248a2a9a56?d=identicon&s=25 Hampton (Guest)
on 2006-04-06 17:21
(Received via mailing list)
Actually, I think what your proposing is really interesting.

For instance, this is how we'd loop a collection (lets say partials w/
collections are overkill here)

We'd normally write

<% for user in @users -%>
<%= user.name %><br/>
<% end -%>

We could write.

<% for user in @users
= user.name + "<br/>"
end %>

Now, the problem with having erb syntax that allows that is we can get
all
non-mvc like temptations. Aka, mixing in our controller code with our
view.

But, then again, I think the second option is much more pretty. I mean,
the
lack of this is basically what requires -%>... so that you can keep from
messing up your response html.

Thoughts?

-hampton.
4a551074ddba4460f95d011c47190d0e?d=identicon&s=25 Henrik N (Guest)
on 2006-04-06 17:40
I believe this can be achieved with concat(), though I've never used it
myself.
A5d8283732da86365736508fef6c1c67?d=identicon&s=25 Nuno (Guest)
on 2006-04-06 17:44
But how to deal with non string producer tokens ? Seems difficult with
concatenation
Ad7805c9fcc1f13efc6ed11251a6c4d2?d=identicon&s=25 Alex Young (Guest)
on 2006-04-06 17:49
(Received via mailing list)
Hampton wrote:
> We could write.
>
> <% for user in @users
> = user.name <http://user.name> + "<br/>"
> end %>
Or, going back to where I first came in...
<%= @users.map{|user|
user.name + "<br />"
} %>
3bef3fc4d0cbcf58f3d66c106e2fd16f?d=identicon&s=25 Mark Van Holstyn (Guest)
on 2006-04-06 17:52
(Received via mailing list)
<%
_erbout << "some cocntent"
%>

mark
119af50160cabfe1fb6f2f05f5018c64?d=identicon&s=25 James Ludlow (Guest)
on 2006-04-06 18:26
(Received via mailing list)
On 4/6/06, Hampton <hcatlin@gmail.com> wrote:
> Now, the problem with having erb syntax that allows that is we can get all
> non-mvc like temptations. Aka, mixing in our controller code with our view.
>
> But, then again, I think the second option is much more pretty. I mean, the
> lack of this is basically what requires -%>... so that you can keep from
> messing up your response html.

Maybe it's worth exploring the possibility that the Java world got
something right.  Custom tags, especially like those from Struts, go a
long way toward cleaning up the view.

<logic:iterate name="someform" property="someprop" id="element">
...
</logic:iterate>

or

<% for element in @someprop -%>
...
<% end -%>


Is one cleaner than the other?  For simple things, probably not.  But
for more complex views, I also have this nagging feeling of annoyance
at all the <% %> tags.

-- James
Ad7805c9fcc1f13efc6ed11251a6c4d2?d=identicon&s=25 Alex Young (Guest)
on 2006-04-06 18:29
(Received via mailing list)
Mark Van Holstyn wrote:
> <%
> _erbout << "some cocntent"
> %>
There's something about using _erbout that strikes me as really, really
icky.  I just can't put my finger on it...
Eeba234182bcbd7faed9ff52e233394d?d=identicon&s=25 Douglas Livingstone (Guest)
on 2006-04-06 19:03
(Received via mailing list)
That'll be the "really I'm private" underscore. How about using
helpers instead? Otherwise, give the Amrita plugin a try, or possibly
define a function like:

def print(stuff)
  _erbout << stuff
end

Douglas

2006/4/6, Alex Young <alex@blackkettle.org>:
A77873df3a9766b208e009248a2a9a56?d=identicon&s=25 Hampton (Guest)
on 2006-04-06 22:14
(Received via mailing list)
Ah, how about we extend the actionview to handle this!

<% for user in @users
    << user.name + "</br>"
end %>

And, the way this would be handled would be that there is...

def <<(input)
  _erabout << input + "\n"
end

Another example...

<% for @row in @rows
   << start_form_tag
   << text_field(:row, :name)
   << hidden_field(:row, :id)
   << end_form_tag
   << "\n"
end %>

or

<% for @row in @rows
   << start_form_tag << text_field(:row, :name) << hidden_field(:row,
:id)
<< end_form_tag << "\n"
end %>

instead of

<% for @row in @rows -%>
  <%= start_form_tag %>
  <%= text_field :row, :name %>
  <%= hidden_field(:row, :id) %>
  <%= end_form_tag %>
<% end -%>

Thoughts?

-hampton.
6f7c877de704c7cc03c8a3b2dc52df92?d=identicon&s=25 Carmen --- (carmen)
on 2006-04-06 22:28
since there are 17 replies all containins <% %>s, i will say it again,
check out Markaby !!

its pretty damn near perfection in terms of minimizing the amount of
typing, let alone typing of < % >s, if you are able to mentally
visualize your pages layout from a handcoding perspective.

it has a few bugs, like i cant get instance variables created inside a
markaby template, to propagate to partials, without explicitly passing
them in via the :locals flag. and if you want to have a designer work on
your templates, dreamweaver etc will surely choke on them.. but come on,
teach your designer to code ;)
3bef3fc4d0cbcf58f3d66c106e2fd16f?d=identicon&s=25 Mark Van Holstyn (Guest)
on 2006-04-06 22:32
(Received via mailing list)
I think that would be nice, except i prefer having a "print" or "echo"
(or
"puts") method rather than "<<". also i think "<<" isnt going to parse
with
out doing something like "self <<". One thing I have always liked better
about php vs ruby is the how you handle printing with echo and print. I
think this would be a wonderful addition for ROR. Anyone instereted in
me
making a plugin? If so let me hear you opinions how how it should work.
print? echo? puts?

mark
A77873df3a9766b208e009248a2a9a56?d=identicon&s=25 Hampton (Guest)
on 2006-04-06 22:38
(Received via mailing list)
I don't know, there is something very ugly to me about...

<% for @row in @rows
   print start_form_tag
   print text_field(:row, :name)
   print hidden_field(:row, :id)
   print end_form_tag
   print "\n"
end %>

I much prefer something more symbolic. Maybe I'm just weird.

-hampton.
A77873df3a9766b208e009248a2a9a56?d=identicon&s=25 Hampton (Guest)
on 2006-04-06 22:44
(Received via mailing list)
Now, you were right about <<, it certainly isn't responding right.

Using a symbol would require a pre-processor it seems.

So, maybe something in between like "p"

<% for @row in @rows
   p start_form_tag
   p text_field(:row, :name)
   p hidden_field(:row, :id)
   p end_form_tag
   p "\n"
end %>

or "o" for output

<% for @row in @rows
   o start_form_tag
   o text_field(:row, :name)
   o hidden_field(:row, :id)
   o end_form_tag
   o "\n"
end %>

The o is pretty nice for my eye to catch.

WWDHHD?

-hampton.
0091f92762685860109bbcb02edfdf27?d=identicon&s=25 Alain Ravet (Guest)
on 2006-04-07 12:55
(Received via mailing list)
cdr
    > since there are 17 replies all containins <% %>s, i will say it
again,
    > check out Markaby !!


Your advice had me give it a good try-1 hour-, and I'm not convinced
(..it's ripe enough yet).

Problems:
- trivial template errors cause complete compilation failures, with no
usable error messages.
- large views are not trivial to convert (see reason below)
- converted views are not  shorter (on average), or not shorter enough
to justify using another language.
- though simple, it's another templating language to learn & master =>
mainteance !!??
...

Maybe I was expecting too much, and  it should only  be used in its
sweet spots, where it really shine but then I have another problem :
introducing another tool, another plugin and another template language
only to use it in a pair of views would make maintenance more complex.

Note: this is only based on trying Markaby out on one not too complex
project. I'm sure there are cases where it makes a real difference.


Alain
235c58ad566abb4c7979bc7033e9882c?d=identicon&s=25 David Morton (dgm)
on 2006-04-07 15:22
James Ludlow wrote:
> Maybe it's worth exploring the possibility that the Java world got
> something right.  Custom tags, especially like those from Struts, go a
> long way toward cleaning up the view.
>
> <logic:iterate name="someform" property="someprop" id="element">
> ...
> </logic:iterate>
>
> or
>
> <% for element in @someprop -%>
> ...
> <% end -%>


I really hope you forgot the <sarcasm> tag there.


I completely fail to see how anyone can think the struts tags can look
better than the erb example.

erb is much more concise.
119af50160cabfe1fb6f2f05f5018c64?d=identicon&s=25 James Ludlow (Guest)
on 2006-04-07 15:41
(Received via mailing list)
On 4/7/06, David Morton <mortonda@dgrmm.net> wrote:
> I completely fail to see how anyone can think the struts tags can look
> better than the erb example.
>
> erb is much more concise.

Like I said, for simple examples it doesn't really matter.  Now take a
look at the OP and tell me that that's clean.  The biggest problem
with <% %> that I've found is that it's harder to see indentation and
blocks.  Tags line up more easily.

-- James
F0a898f6a6131fe68d79ba1a6c060dd9?d=identicon&s=25 Jon Bauman (baumanj)
on 2006-04-07 19:06
James Ludlow wrote:
> Like I said, for simple examples it doesn't really matter.  Now take a
> look at the OP and tell me that that's clean.  The biggest problem
> with <% %> that I've found is that it's harder to see indentation and
> blocks.  Tags line up more easily.

Why not just use the erb blocks as tags for the purpose of indentation?
It looks attractive and consistent. There are some other things that I
do to clean up the view:

1. Omit unnecessary parenthesis and braces for method invocations and
hash arguments.
2. Factor any statement that's more than about 1 line of code into the
model or controller as appropriate.
3. Use form helpers (e.g., text_field) rather than the lowel-level form
tag helpers (e.g., text_field_tag) when you can, they take care of 90%
of the common cases very simply. Also, I use symbols instead of stings
for these arguments because it conveys thet fact that these arguments
will be used to make calls rather than used as strings.
4. Use ruby's efficient syntax to your advantage: write "unless" instead
of "if not" and "obj ? val1 : val2" instead of "obj.nil? val1 : val2".

Here's how I'd reformulate the OP's example:

Add a one-liner to the model:

  def other_categories
    Category.find(:all, :conditions => [ "id <> ?", id] )
  end

Add another one-liner to the controller. (You'll also have to set
@category, but that's a pretty standard thing to do anyway.) Notice that
you don't need to set the :selected option because it sets
@category.parent_id as selected by default.

  @select_options = @category.other_categories.collect{|c| [ c.title,
c.id ] }

Now, the view is actually really clean:

  <%= start_form_tag %>
    <%= text_field :category, :title, :size => 20, :maxlength => 128 %>
    <% unless category.parent_id.nil? %>
      <%= select :category, :parent_id, @select_options %>
    <% end %>
    <%= submit_tag "Enregistrer" %>
    <%= link_to "Annuler", :action => "list" %>
  <%= end_form_tag %>

Don't you think?
This topic is locked and can not be replied to.