Rails with Ajax

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

next to it.

See listings below to see code snippet:

listing 1(search.html.erb)

<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>

listing 2(trace_controller.rb)

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 top (1) * from tbl_traces
        where short_exchange_id = '" + params[:short_exchange_id]  + "'
order by created_on desc")

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

listing 3(loader.js.erb)

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

listing 4 (_group_trace.html.erb)

<div class="eight columns">
<dl id="accordion" class="list-accordion">
<dt><span></span>view one</dt>
<dd>
<p>Data here</p>
</dd>
</dl>
</div>

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.

On Wed, Feb 8, 2012 at 2:00 PM, Lekkie L. [email protected]
wrote:

listing 3(loader.js.erb)

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

Is that a “j” after the = ??

Javier Q.

Well, you go here, right?
yourapp.com/search ?

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

Linus P. wrote in post #1044801:

Well, you go here, right?
yourapp.com/search ?

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

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

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.

Javier Q. wrote in post #1044799:

On Wed, Feb 8, 2012 at 2:00 PM, Lekkie L. [email protected]
wrote:

listing 3(loader.js.erb)

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

Is that a “j” after the = ??

Javier Q.

Removed but still the same.

Yes, but the code in the search view is not executed again when the AJAX
request is fired :slight_smile:

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!

Linus P. wrote in post #1045014:

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.

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:

<%= tbl_trace.short_exchange_id %>
<%= tbl_trace.short_exchange_id %>

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:

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

On Tue, Feb 14, 2012 at 08:28, Naira K. [email protected] wrote:

Extracted source (around line #19):

undefined method `model_name’ for NilClass:Class

18:


19: <%= render(@grouptrace) %>
20:

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 A.: 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

Linus P. wrote in post #1046510:

Yes, but the code in the search view is not executed again when the AJAX
request is fired :slight_smile:

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!

I tried this but I get this error

Extracted source (around line #19):

undefined method `model_name’ for NilClass:Class

18:


19: <%= render(@grouptrace) %>
20: