Rails with Ajax

21 views
Skip to first unread message

Lekkie Lekkie

unread,
Feb 8, 2012, 2:00:07 PM2/8/12
to rubyonra...@googlegroups.com
Hi all,

I am quite new to Rails.

The code below loads a set of data from the database. When I click on
one of the item from db, it will load more details of same item from
database and display in the <div> next to it.

See listings below to see code snippet:

listing 1(search.html.erb)
--------------------------
[code]
<div class="row">
<div class="four columns">
<nav>
<ul class="list group">
<% @tbl_unique_traces.each do |tbl_trace| %>
<li>
<a data-remote="true" href="<%= trace_loader_url (tbl_trace)
%>?short_exchange_id=<%= tbl_trace.short_exchange_id %>">
<h6>
<%= tbl_trace.short_exchange_id %>
</h6>
<%= tbl_trace.short_exchange_id %></a></li>
</li>
<% end %>
</ul>
</nav>
</div>

<div id="loader_div" name="loader_div">
<% if @group_trace %>
<%= render(@group_trace) %>
<% end %>
</div>
</div>
[/code]


listing 2(trace_controller.rb)
------------------------------
[code]
def search
@tbl_unique_traces = TblTrace.find_by_sql("select top.....)

respond_to do |format|
format.html # show.html.erb
format.json { render :json => @tbl_unique_traces }
end
end

def loader
@group_trace = TblTrace.find_by_sql("select ........)

respond_to do |format|
format.html # loader.html.erb
format.js
format.json { render :json => @group_trace }
end
end
[/code]

listing 3(loader.js.erb)
-------------------------
[code]
$('#loader_div').html("<%=j render(@group_trace)%>");
[/code]


listing 4 (_group_trace.html.erb)
--------------------------------
[code]
<div class="eight columns">
<dl id="accordion" class="list-accordion">
<dt><span></span>view one</dt>
<dd>
<p>Data here</p>
</dd>
</dl>
</div>
[/code]

The problem is that, this codeline never get executed:

<% if @group_trace %>
<%= render(@group_trace) %>
<% end %>

And I can confirm that @group_trace has data in the trace_controller.

What can be the problem? Please help out.

Regards.

--
Posted via http://www.ruby-forum.com/.

Javier Quarite

unread,
Feb 8, 2012, 2:09:22 PM2/8/12
to rubyonra...@googlegroups.com
On Wed, Feb 8, 2012 at 2:00 PM, Lekkie Lekkie <li...@ruby-forum.com> wrote:

listing 3(loader.js.erb)
-------------------------
[code]
$('#loader_div').html("<%=j render(@group_trace)%>");
[/code]


Is that a "j" after the = ??


Javier Q. 

Linus Pettersson

unread,
Feb 8, 2012, 2:15:38 PM2/8/12
to rubyonra...@googlegroups.com
Well, you go here, right?

Then the @group_trace is nil because it's not created until you run the loader action.

Naira Kobo

unread,
Feb 9, 2012, 2:16:16 AM2/9/12
to rubyonra...@googlegroups.com
Linus Pettersson wrote in post #1044801:

Does this mean the logic of this app is wrong, how else can I do this
right?

Naira Kobo

unread,
Feb 9, 2012, 2:17:56 AM2/9/12
to rubyonra...@googlegroups.com
Javier Quarite wrote in post #1044799:

Removed but still the same.

Linus Pettersson

unread,
Feb 9, 2012, 2:49:18 PM2/9/12
to rubyonra...@googlegroups.com
Well, the code in the search view is executed when the view is rendered. It is not executed again when you inject the html using javascript.
So the if @group_trace code is only executed when the search view is rendered and @group_trace is not created yet.


What are you actually trying to achieve? What do you want to do with the if @group_trace code part? Why not just remove it? You're still adding the data by injecting the html using javascript.

Naira Kobo

unread,
Feb 13, 2012, 4:05:51 AM2/13/12
to rubyonra...@googlegroups.com
Linus Pettersson wrote in post #1045014:

If I remove it, it throws a nil object exception which basically means
the object is empty.

I just want to click on this link in search.html.erb:

<a data-remote="true" href="<%= trace_loader_url (tbl_trace)
%>?short_exchange_id=<%= tbl_trace.short_exchange_id %>">
<h6>
<%= tbl_trace.short_exchange_id %>
</h6>
<%= tbl_trace.short_exchange_id %></a>


and it should load the data returned in trace_controller.rb:

def loader
@group_trace = TblTrace.find_by_sql("select top (1) * from tbl_traces
where short_exchange_id = '" + params[:short_exchange_id] + "'
order by created_on desc")


and display in the div in seach.html.erb here:

<div id="loader_div" name="loader_div">
<% if @group_trace %>
<%= render(@group_trace) %>
<% end %>
</div>

--
Posted via http://www.ruby-forum.com/.

Linus Pettersson

unread,
Feb 13, 2012, 11:45:07 AM2/13/12
to rubyonra...@googlegroups.com
Yes, but the code in the search view is not executed again when the AJAX request is fired :)

So, you have to do the check in your loader.js.erb and not the search view. Something like this should work:

<% if @group_trace %>
$('#loader_div').html("<%=j render(@group_trace)%>");
<% end %>

Cheers!

Naira Kobo

unread,
Feb 14, 2012, 8:28:07 AM2/14/12
to rubyonra...@googlegroups.com
Linus Pettersson wrote in post #1046510:

I tried this but I get this error

Extracted source (around line #19):

undefined method `model_name' for NilClass:Class

18: <div id="loader_div" name="loader_div">
19: <%= render(@grouptrace) %>
20: </div>

Dave Aronson

unread,
Feb 14, 2012, 9:14:52 AM2/14/12
to rubyonra...@googlegroups.com
On Tue, Feb 14, 2012 at 08:28, Naira Kobo <li...@ruby-forum.com> wrote:

> Extracted source (around line #19):
>
> undefined method `model_name' for NilClass:Class
>
> 18:                     <div id="loader_div" name="loader_div">
> 19:         <%= render(@grouptrace) %>
> 20:       </div>

This is telling you that @grouptrace is nil. You dropped the
underscore from inside the name. (Minirant: This is one of the
things I don't like about languages letting you reference undeclared
variables. You can't tell "I deliberately haven't set it yet, so the
fact that it's nil is significant" from a typo.)

-Dave

--
Dave Aronson:  Available Cleared Ruby on Rails Freelancer
(NoVa/DC/Remote) -- see www.DaveAronson.com, and blogs at
www.Codosaur.us, www.Dare2XL.com, www.RecruitingRants.com

Reply all
Reply to author
Forward
0 new messages