Forum: Ruby on Rails rails 2D array access in Helper method

01b14fccb535f9f1b35e00669fe79a80?d=identicon&s=25 leo nike (stack)
on 2013-11-01 15:20
Hi, I Want to simply print out 2d array elements. Method is located in
Helper module. Calling helper method from jQuery. At the moment I'm not
getting output (=> 0..3) I tried to do iterate through array via .each()
method, but it would just print en entire array, however i want to
access each element and convert it either to string or integer. can
someone point me to possible solution? thanks!

       #app/helpers/controller_helper.rb
           def get_array
              database = SQLite3::Database.open("test.db")
              result = database.execute("select * from table1")
              print_array(result)
           end

           def print_array(array)
             for i in 0..array.length
                  puts array[i][i]
             end
           end

      -------------------------------------------------------------------
     #app/views/controller/file.js.erb
       if($('.check_box1').is(':checked')){
            $("#div2").html("<%= get_array%>")
       }
Aa082c8b00a50928e5860dcd70bf2368?d=identicon&s=25 tamouse m. (tamouse_m)
on 2013-11-03 22:36
(Received via mailing list)
On Nov 1, 2013, at 9:20 AM, leo nike <lists@ruby-forum.com> wrote:

>              result = database.execute("select * from table1")
>     #app/views/controller/file.js.erb
>       if($('.check_box1').is(':checked')){
>            $("#div2").html("<%= get_array%>")
>       }
>
> --
> Posted via http://www.ruby-forum.com/.

You dont want to use puts in there. You want to return the value so it
gets evaluated in the erb code. puts returns nil, which means you get
nothing inside the html element.

Im not exactly sure from that method what you want inside div2 either.

Heres what Id suggest:

def get_array()
  # sqlite stuff as you have it
  format_table(result)
end

def format_table(data)
  out = "<table>\n"
  out += data.map do |row|
    format_row(row)
  end.join("\n")
  out += "\n</table>\n"
end

def format_row(row)
  out = "<tr>"
  out += row.map do |cell|
    format_cell(cell)
  end.join
  out += "</tr>"
end

def format_cell(cell)
  "<td>#{cell}</td>"
end

This will output html code, which seems like what youd want at that
point.
Aa082c8b00a50928e5860dcd70bf2368?d=identicon&s=25 tamouse m. (tamouse_m)
on 2013-11-04 10:20
(Received via mailing list)
On Nov 3, 2013, at 3:35 PM, Tamara Temple <tamouse.lists@gmail.com>
wrote:

>>      #app/helpers/controller_helper.rb
>>          end
> You dont want to use puts in there. You want to return the value so it gets
evaluated in the erb code. puts returns nil, which means you get nothing inside
the html element.
> def format_table(data)
>    format_cell(cell)
>  end.join
>  out += "</tr>"
> end
>
> def format_cell(cell)
>  "<td>#{cell}</td>"
> end
>
> This will output html code, which seems like what youd want at that point.

then i decided it was too 'wet', and refactored:

def wrap(s, tag, attr={}, &b)
  s = [s] unless s.is_a? Array
  attr = attr.empty? ? '' : " #{attr.map{|k,v| "#{k}='#{v}'"}.join("
")}"
  out = "<#{tag}#{attr}>"
  out += s.inject("") {|m,o| m+="#{block_given? ? (yield o) : o}"}
  out += "</#{tag}>"
end


def format_table(data)
  wrap(data,"table",border: 1) do |row|
    wrap(row,"tr") do |cell|
      wrap(cell,"td")
    end
  end
end

data=[[1,2,3,4],[5,6,7,8]]

formate_table(data) # => "<table
border='1'><tr><td>1</td><td>2</td><td>3</td><td>4</td></tr><tr><td>5</td><td>6</td><td>7</td><td>8</td></tr></table>"

(https://gist.github.com/tamouse/7300078 )
01b14fccb535f9f1b35e00669fe79a80?d=identicon&s=25 leo nike (stack)
on 2013-11-04 15:05
Great! I didnt even think about implementation like that, that's
awesome. thanks a lot! can I contact you, in case something doesnt work
here?
Aa082c8b00a50928e5860dcd70bf2368?d=identicon&s=25 tamouse m. (tamouse_m)
on 2013-11-04 23:51
(Received via mailing list)
On Nov 4, 2013, at 8:05 AM, leo nike <lists@ruby-forum.com> wrote:

> Great! I didnt even think about implementation like that, that's
> awesome. thanks a lot! can I contact you, in case something doesnt work
> here?

Just reply on list, there are some truly awesome people here, most
definitely not including me.
Aa082c8b00a50928e5860dcd70bf2368?d=identicon&s=25 tamouse m. (tamouse_m)
on 2013-11-04 23:54
(Received via mailing list)
On Nov 4, 2013, at 3:19 AM, Tamara Temple <tamouse.lists@gmail.com>
wrote:

>>> access each element and convert it either to string or integer. can
>>>           for i in 0..array.length
>>> --
>> format_table(result)
>> def format_row(row)
>>
> end
> data=[[1,2,3,4],[5,6,7,8]]
>
> formate_table(data) # => "<table
border='1'><tr><td>1</td><td>2</td><td>3</td><td>4</td></tr><tr><td>5</td><td>6</td><td>7</td><td>8</td></tr></table>"
>
> (https://gist.github.com/tamouse/7300078 )
>

Listening to one of Ruby Tapas made me shake my head with pain. This:

   s = [s] unless s.is_a? Array

should be this:

  s = Array.new(s)
01b14fccb535f9f1b35e00669fe79a80?d=identicon&s=25 leo nike (stack)
on 2013-11-06 19:08
Hi, once again thanks for you code contribution, that helped me to see
problem from a different perspective a little bit. I liked both of your
code snippets, and 1st one in particular (since i actually understand
it)

There is only one issue though, if I try to run code below on trough
jQuery (when the checkbox is checked) it wouldnt really execute
anything.
That's what I had problem before, and I know the problem is not with
jQuery method. I cant easily modify code to
$("#div2").html("<%= 'hello'%>") and it would print 'hello' in that div.
So, there is something that jQuery doesnt see in iether get_array or
format_table method. I've tried to merge all the 4 methods into one and
run it as one method, but it still wouldnt work. Would you please check
it one again, and let me know what could be changed?

And yes, I just want to output the result of parsed array into html
code. I dont really care how, it's just I know only Jquery .html()
method and it seems relatively simple.

Thank you very much

def get_array()
  # sqlite stuff as you have it
  format_table(result)
end

def format_table(data)
  out = "<table>\n"
  out += data.map do |row|
    format_row(row)
  end.join("\n")
  out += "\n</table>\n"
end

def format_row(row)
  out = "<tr>"
  out += row.map do |cell|
    format_cell(cell)
  end.join
  out += "</tr>"
end

def format_cell(cell)
  "<td>#{cell}</td>"
end

----------------------------------------------------------------------
#app/views/controller/file.js.erb
       if($('.check_box1').is(':checked')){
            $("#div2").html("<%= get_array%>")
       }
Please log in before posting. Registration is free and takes only a minute.
Existing account

NEW: Do you have a Google/GoogleMail, Yahoo or Facebook account? No registration required!
Log in with Google account | Log in with Yahoo account | Log in with Facebook account
No account? Register here.