Thread: Ruby Newbie

    #1
  1. Contributing User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Nov 2004
    Posts
    85
    Rep Power
    10

    Ruby Newbie


    Hi all,

    Ruby and I are having a hard time bonding. I have a very basic question, and I hope that someone would be willing/able to assist me.

    I have a simple web form where users may search by case number. I have my Controller set up to take a parameter, and query the DB with it. It appears that the parameter is getting set, but apparently the syntax I am using to query with is wrong. I am able to return a record when I hard-code a case number into the query statement, but not when I use a variable.

    Now, if I were in php, this would be a breeze to solve... echo the value of the parameter to make sure it's getting set...echo the value of the query statement and make sure it's correct. Problem solved. Unfortunately, I don't know how to do even these simple error-checks in Ruby, and the books I have read are vague on this topic, to say the least.

    Since Ruby is new here, I'll wait for a response before I start posting code snippetts of what syntax I've tried. I hope there are some Ruby humans out there that I can mingle with.

    Thanks in advance!! ~Snow
  2. #2
  3. fork while true;
    Devshed God 1st Plane (5500 - 5999 posts)

    Join Date
    May 2005
    Location
    England, UK
    Posts
    5,538
    Rep Power
    1050
    This is specifically a rails question. please put that in the title in future.

    I'm not a rails guy, but i'm very much a ruby guy. Can we see some code please?
  4. #3
  5. Contributing User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Nov 2004
    Posts
    85
    Rep Power
    10
    My apologies - as I said, I'm a newbie...

    This page - search.rhtml - is where user enters case number to search by. Calls the 'list' method in the case_controller.rb.

    Code:
    <html>
    <head>
    <title>Untitled Document</title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <h1 align="center">Case Search</h1>
    <h3 align="center"><font color="red">*</font>&nbsp;Indicates required field</h3>
    </head>
    
    <body>
    
    <form action='list' method='post'>
      <table border="0" align="center" cellspacing="5" cellpadding="3" bgcolor="#DEBDDE">
        <tr>
          <td nowrap align="right">CASE ID:</td>
          <td><input type="text" name="case[case_id]"></td>
        </tr>
    	<tr>
    	  <td align="right">ENTRY DATE:</td>
          <td><input type="text" name="case[entry_date]"></td>
    	</tr>
    	<tr>
          <td align="right">NAME:</td>
    	  <td><input type="text" name="case[l_name]" size="20">
    	      <input type="text" name="case[f_name]" size="20"></td>
    	</tr>
    	<tr>
    	  <td colspan="2" align="center"><input type="submit" name="submit" value="Query"></td>
    	</tr>     
      </table>
    </form>
    </body>
    </html>
    case_controller.rb:

    Code:
    class CaseController < ApplicationController
      layout "cor_footer"
      scaffold :case
    
    def list     
    
     @case = @params['case_id'] 
         
     @case_search = 
      Case.find(:all, 
                  :conditions => ["case_id = @case",   @params])   
         
    
      end
    Which should display results in list.rhtml:

    Code:
    <h2> Listing Search Results </h2>
    
    <table border=1 cellpadding=5>
    
    <tr>
    
    <td width="20%"><p align="center"><i><b>Case ID</b></i></td>
    <td width="60%"><p align="center"><i><b>Name</b></i></td>
    <td width="20%"><p align="center"><i><b>Entry Date</b></i></td>
    
    </tr>
    
    
    <% if (@case == nil) || (@case == code.case_id) %>
    <% @case_search.each do |code| %>
    
    <tr>
    
    <td>&nbsp;<%= code.case_id %></td>
    <td>&nbsp;<%= code.l_name %></td>
    <td>&nbsp;<%= code.entry_date %></td>
    
    </tr>
    
    
    <% end %>
    <% end %>
    </table>
    As mentioned, I hit the table fine when I hard-code a value, like so:

    Code:
    @case_search = Case.find(:all, :conditions => "case_id = '28493'")


    So, I'm guessing that the trouble lies here somewhere:

    Code:
    def list
      @case = @params['case_id']    
         
      @case_search = Case.find(:all, 
                       :conditions => ["case_id = @case", @params])
    end
    Thank you for helping!
  6. #4
  7. fork while true;
    Devshed God 1st Plane (5500 - 5999 posts)

    Join Date
    May 2005
    Location
    England, UK
    Posts
    5,538
    Rep Power
    1050
    You need to have it interpolate the values..

    "case_id = '#@case'"

    If it's not a package, global or class variable you need to do #{variable} so ruby knows.

    edit: I also wrapped some quotes around it. I believe rails handles escaping for you, but i'm no rails guy.
  8. #5
  9. Contributing User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Nov 2004
    Posts
    85
    Rep Power
    10
    Thanks for the suggestion.

    I tried this:

    Code:
    def list
         
    
         @case = @params['case_id']     
         @case_search = Case.find(:all, :conditions => "case_id = '#{@case}'")
                                                      
             
    
      end
    Still no dice. I tried it with and without curlies. Perhaps my problem lies elsewhere. I'm only making the assumption that it is picking up my param value, because when I have a syntax error, it shows the value of case_id - but perhaps it is not passing it to the controller. Do you know of a way to echo the param value to the screen so I can see what I'm passing?
  10. #6
  11. fork while true;
    Devshed God 1st Plane (5500 - 5999 posts)

    Join Date
    May 2005
    Location
    England, UK
    Posts
    5,538
    Rep Power
    1050
    there's a flash command in rails i think, probably under another name

    you could flash it.
  12. #7
  13. Contributing User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Nov 2004
    Posts
    85
    Rep Power
    10
    Ok, that helped alot! I now know that my param is not getting set correctly. SO - my next question for you is, do you know the difference between these syntax?

    Code:
    @case = @params['case_id']
    
    @case = @params[:case_id]
    I have seen them written both ways, and I'm thinking that they are interchangable, but I'm not sure?
  14. #8
  15. fork while true;
    Devshed God 1st Plane (5500 - 5999 posts)

    Join Date
    May 2005
    Location
    England, UK
    Posts
    5,538
    Rep Power
    1050
    They are interchangeable.

    The first form is a string, you know that. The second form is a symbol. The idea is that if you use a string many times, you should convert it to a symbol. When ruby gets bytecode compilation down, it will save some memory by only storing it once.
  16. #9
  17. Contributing User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Nov 2004
    Posts
    85
    Rep Power
    10
    Well, it's still not getting the param into the variable. I put a flash on my list.rhtml page, and the var is empty.

    Do you see anything else in my HTML or anywhere else that may throw a red flag at you? I'm running out of ideas!
  18. #10
  19. fork while true;
    Devshed God 1st Plane (5500 - 5999 posts)

    Join Date
    May 2005
    Location
    England, UK
    Posts
    5,538
    Rep Power
    1050
    Well i had presumed rails required you give those names... however i'm tempted to change them to static values at least as a test...

    <input type="text" name="case_id">

    Like i said, i'm not a rails guy, so sh!t may break.

    Comments on this post

    • SnowWhite agrees
  20. #11
  21. Contributing User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Nov 2004
    Posts
    85
    Rep Power
    10
    Well, believe or not, that worked! You're right, the reason I had named it that way was because when I was trying to load combo boxes in a different form, Rails wouldn't recognize the field unless it was associated with the table name...sheesh.
    Wonder how that's going to work when I need to get combo box values back? Oh well - cross that bridge when I get to it I guess.

    Thanks for your help and suggestions.
    ~Snow W.

IMN logo majestic logo threadwatch logo seochat tools logo