rails newbie need help with form. I have a movie application. In the index I list all the movies and in addition i have ratings check boxes for (R, PG, PG-13, G) basically when you check a box and submit, the page should refresh with movies with the chosen rating. So if you check R,PG; only movies rated R and PG should be displayed. At the moment, when i check any box and submit the query seems to work but no movies are returned. When i checked the log this is what i get. Parameters: {"utf8"=>"✓", "ratings"=>{"R"=>"on"}} Movie Load (0.1ms) SELECT "movies".* FROM "movies" WHERE (rating LIKE''--- - R - ''''on'''' '') here''s my movie.rb model code. def self.checkBoxTest(ratings) if ratings where(''rating LIKE?'', ratings) else scoped end end note: using haml for views: index.html.haml %h1 All Movies = form_tag movies_path, :method => :get do Include: - @all_ratings.each do |rating| ="#{rating}" = check_box_tag "ratings[#{rating}]", params[:ratings] = submit_tag ''Refresh'', :name => nil %table#movies def index @movies = Movie.order(sort_column) @movies = Movie.checkBoxTest(params[:ratings]) @all_ratings = Movie.find_all_rating end here''s my controller index method -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
On Mar 13, 2012, at 12:21 PM, dasibre wrote:> rails newbie need help with form. > I have a movie application. In the index I list all the movies and in > addition i have ratings check boxes for (R, PG, PG-13, G) > basically when you check a box and submit, the page should refresh > with movies with the chosen rating. So if you check R,PG; only movies > rated R and PG should be displayed. > At the moment, when i check any box and submit the query seems to work > but no movies are returned. When i checked the log this is what i get. > > Parameters: {"utf8"=>"✓", "ratings"=>{"R"=>"on"}} > Movie Load (0.1ms) SELECT "movies".* FROM "movies" WHERE (rating > LIKE''--- > - R > - ''''on'''' > '')This looks very much like it''s trying to compare the field with YAML. What is the field type for rating, and have you added serialize to it anywhere? (I don''t see that in your model, but you haven''t quoted all of it.)> > here''s my movie.rb model code. > def self.checkBoxTest(ratings) > if ratings > where(''rating LIKE?'', ratings) > else > scoped > end > endInstead of LIKE, try IN. You''re trying to compare an array with a single value, if I''m reading this correctly. If only the R is checked, your params[:ratings] will equal [''R'']. If R and PG are checked, it will look like [''R'',''PG'']. So a query like this in raw SQL would look like SELECT * FROM movies WHERE rating IN (''R'',''PG''); Walter> > note: using haml for views: > index.html.haml > %h1 All Movies > = form_tag movies_path, :method => :get do > Include: > - @all_ratings.each do |rating| > ="#{rating}" > = check_box_tag "ratings[#{rating}]", params[:ratings] > = submit_tag ''Refresh'', :name => nil > %table#movies > > def index > @movies = Movie.order(sort_column) > @movies = Movie.checkBoxTest(params[:ratings]) > @all_ratings = Movie.find_all_rating > end > here''s my controller index method > > -- > You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. > To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org > To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. > For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en. >-- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Thanks for the quick response Walter. Rating is a text field. "SERIALIZE" don''t have it in my model, don''t know what it is...will look it up. As you can tell by the method name "checkBoxTest" I''m testing the feature one check box at a time, but you make a good point about using LIKE, IN to compare. I will try that. I''m not sure if this is right but, I think the check_box_tag passes an extra parameter "on" in addition to the Ratings and i''m not sure how to deal with that. On Mar 13, 12:32 pm, Walter Lee Davis <wa...-HQgmohHLjDZWk0Htik3J/w@public.gmane.org> wrote:> On Mar 13, 2012, at 12:21 PM, dasibre wrote: > > > rails newbie need help with form. > > I have a movie application. In the index I list all the movies and in > > addition i have ratings check boxes for (R, PG, PG-13, G) > > basically when you check a box and submit, the page should refresh > > with movies with the chosen rating. So if you check R,PG; only movies > > rated R and PG should be displayed. > > At the moment, when i check any box and submit the query seems to work > > but no movies are returned. When i checked the log this is what i get. > > > Parameters: {"utf8"=>"✓", "ratings"=>{"R"=>"on"}} > > Movie Load (0.1ms) SELECT "movies".* FROM "movies" WHERE (rating > > LIKE''--- > > - R > > - ''''on'''' > > '') > > This looks very much like it''s trying to compare the field with YAML. What is the field type for rating, and have you added serialize to it anywhere? (I don''t see that in your model, but you haven''t quoted all of it.) > > > > > here''s my movie.rb model code. > > def self.checkBoxTest(ratings) > > if ratings > > where(''rating LIKE?'', ratings) > > else > > scoped > > end > > end > > Instead of LIKE, try IN. You''re trying to compare an array with a single value, if I''m reading this correctly. > > If only the R is checked, your params[:ratings] will equal [''R'']. If R and PG are checked, it will look like [''R'',''PG'']. So a query like this in raw SQL would look like SELECT * FROM movies WHERE rating IN (''R'',''PG''); > > Walter > > > > > > > > > > > note: using haml for views: > > index.html.haml > > %h1 All Movies > > = form_tag movies_path, :method => :get do > > Include: > > - @all_ratings.each do |rating| > > ="#{rating}" > > = check_box_tag "ratings[#{rating}]", params[:ratings] > > = submit_tag ''Refresh'', :name => nil > > %table#movies > > > def index > > @movies = Movie.order(sort_column) > > @movies = Movie.checkBoxTest(params[:ratings]) > > @all_ratings = Movie.find_all_rating > > end > > here''s my controller index method > > > -- > > You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. > > To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org > > To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org > > For more options, visit this group athttp://groups.google.com/group/rubyonrails-talk?hl=en.-- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
On Mar 13, 2012, at 12:54 PM, dasibre wrote:> Thanks for the quick response Walter. > Rating is a text field. > "SERIALIZE" don''t have it in my model, don''t know what it is...will > look it up. > > As you can tell by the method name "checkBoxTest" I''m testing the > feature one check box at a time, but > you make a good point about using LIKE, IN to compare. I will try > that.I meant to use IN rather than LIKE. LIKE is "case-insensitive text comparison" and IN is "does this value occur in that array". params[:rating] is a hash, but it will get converted to an array if you pass it into the where() method the way you are doing it. I''m still not clear why it''s being converted to YAML the way it is in your LIKE clause, but I guess that''s the only string-like thing that would preserve the meaning of the hash. It''s not as neat as your HAML, but the following ERB: <p> <%= check_box_tag "ratings[G]", ''G'', (params[:ratings].include? ''G'') %> <%= label_tag "ratings[G]", "G" %> </p> <p> <%= check_box_tag "ratings[PG]", ''PG'', (params[:ratings].include? ''PG'') %> <%= label_tag "ratings[PG]", "PG" %> </p> <p> <%= check_box_tag "ratings[R]", ''R'', (params[:ratings].include? ''R'') %> <%= label_tag "ratings[R]", "R" %> </p> <p> <%= check_box_tag "ratings[NC-17]", ''NC-17'', (params[:ratings].include? ''NC-17'') %> <%= label_tag "ratings[NC-17]", "NC-17" %> </p> <p> <%= check_box_tag "ratings[X]", ''X'', (params[:ratings].include? ''X'') %> <%= label_tag "ratings[X]", "X" %> </p> <p> <%= check_box_tag "ratings[NR]", ''NR'', (params[:ratings].include? ''NR'') %> <%= label_tag "ratings[NR]", "NR" %> </p> Expands to this HTML: <p> <input id="ratings_G" name="ratings[G]" type="checkbox" value="G" /> <label for="ratings_G">G</label> </p> <p> <input checked="checked" id="ratings_PG" name="ratings[PG]" type="checkbox" value="PG" /> <label for="ratings_PG">PG</label> </p> <p> <input id="ratings_R" name="ratings[R]" type="checkbox" value="R" /> <label for="ratings_R">R</label> </p> <p> <input id="ratings_NC-17" name="ratings[NC-17]" type="checkbox" value="NC-17" /> <label for="ratings_NC-17">NC-17</label> </p> <p> <input id="ratings_X" name="ratings[X]" type="checkbox" value="X" /> <label for="ratings_X">X</label> </p> <p> <input id="ratings_NR" name="ratings[NR]" type="checkbox" value="NR" /> <label for="ratings_NR">NR</label> </p> And when that form is submitted, it will appear at the controller as params[:ratings]. If you pass it into your where clause, using IN instead of LIKE, you should get a query like the one I outlined. As a bonus, the checkboxes will maintain their state through a form request. Walter> > I''m not sure if this is right but, I think the check_box_tag passes an > extra parameter "on" in addition to the Ratings and i''m not sure how > to deal with that. > > On Mar 13, 12:32 pm, Walter Lee Davis <wa...-HQgmohHLjDZWk0Htik3J/w@public.gmane.org> wrote: >> On Mar 13, 2012, at 12:21 PM, dasibre wrote: >> >>> rails newbie need help with form. >>> I have a movie application. In the index I list all the movies and in >>> addition i have ratings check boxes for (R, PG, PG-13, G) >>> basically when you check a box and submit, the page should refresh >>> with movies with the chosen rating. So if you check R,PG; only movies >>> rated R and PG should be displayed. >>> At the moment, when i check any box and submit the query seems to work >>> but no movies are returned. When i checked the log this is what i get. >> >>> Parameters: {"utf8"=>"✓", "ratings"=>{"R"=>"on"}} >>> Movie Load (0.1ms) SELECT "movies".* FROM "movies" WHERE (rating >>> LIKE''--- >>> - R >>> - ''''on'''' >>> '') >> >> This looks very much like it''s trying to compare the field with YAML. What is the field type for rating, and have you added serialize to it anywhere? (I don''t see that in your model, but you haven''t quoted all of it.) >> >> >> >>> here''s my movie.rb model code. >>> def self.checkBoxTest(ratings) >>> if ratings >>> where(''rating LIKE?'', ratings) >>> else >>> scoped >>> end >>> end >> >> Instead of LIKE, try IN. You''re trying to compare an array with a single value, if I''m reading this correctly. >> >> If only the R is checked, your params[:ratings] will equal [''R'']. If R and PG are checked, it will look like [''R'',''PG'']. So a query like this in raw SQL would look like SELECT * FROM movies WHERE rating IN (''R'',''PG''); >> >> Walter >> >> >> >> >> >> >> >> >> >>> note: using haml for views: >>> index.html.haml >>> %h1 All Movies >>> = form_tag movies_path, :method => :get do >>> Include: >>> - @all_ratings.each do |rating| >>> ="#{rating}" >>> = check_box_tag "ratings[#{rating}]", params[:ratings] >>> = submit_tag ''Refresh'', :name => nil >>> %table#movies >> >>> def index >>> @movies = Movie.order(sort_column) >>> @movies = Movie.checkBoxTest(params[:ratings]) >>> @all_ratings = Movie.find_all_rating >>> end >>> here''s my controller index method >> >>> -- >>> You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. >>> To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org >>> To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org >>> For more options, visit this group athttp://groups.google.com/group/rubyonrails-talk?hl=en. > > -- > You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. > To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org > To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. > For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en. >-- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Thank you very much for your help. On Mar 13, 1:38 pm, Walter Lee Davis <wa...-HQgmohHLjDZWk0Htik3J/w@public.gmane.org> wrote:> On Mar 13, 2012, at 12:54 PM, dasibre wrote: > > > Thanks for the quick response Walter. > > Rating is a text field. > > "SERIALIZE" don''t have it in my model, don''t know what it is...will > > look it up. > > > As you can tell by the method name "checkBoxTest" I''m testing the > > feature one check box at a time, but > > you make a good point about using LIKE, IN to compare. I will try > > that. > > I meant to use IN rather than LIKE. LIKE is "case-insensitive text comparison" and IN is "does this value occur in that array". params[:rating] is a hash, but it will get converted to an array if you pass it into the where() method the way you are doing it. I''m still not clear why it''s being converted to YAML the way it is in your LIKE clause, but I guess that''s the only string-like thing that would preserve the meaning of the hash. > > It''s not as neat as your HAML, but the following ERB: > > <p> > <%= check_box_tag "ratings[G]", ''G'', (params[:ratings].include? ''G'') %> > <%= label_tag "ratings[G]", "G" %> > </p> > <p> > <%= check_box_tag "ratings[PG]", ''PG'', (params[:ratings].include? ''PG'') %> > <%= label_tag "ratings[PG]", "PG" %> > </p> > <p> > <%= check_box_tag "ratings[R]", ''R'', (params[:ratings].include? ''R'') %> > <%= label_tag "ratings[R]", "R" %> > </p> > <p> > <%= check_box_tag "ratings[NC-17]", ''NC-17'', (params[:ratings].include? ''NC-17'') %> > <%= label_tag "ratings[NC-17]", "NC-17" %> > </p> > <p> > <%= check_box_tag "ratings[X]", ''X'', (params[:ratings].include? ''X'') %> > <%= label_tag "ratings[X]", "X" %> > </p> > <p> > <%= check_box_tag "ratings[NR]", ''NR'', (params[:ratings].include? ''NR'') %> > <%= label_tag "ratings[NR]", "NR" %> > </p> > > Expands to this HTML: > > <p> > <input id="ratings_G" name="ratings[G]" type="checkbox" value="G" /> > <label for="ratings_G">G</label> > </p> > <p> > <input checked="checked" id="ratings_PG" name="ratings[PG]" type="checkbox" value="PG" /> > <label for="ratings_PG">PG</label> > </p> > <p> > <input id="ratings_R" name="ratings[R]" type="checkbox" value="R" /> > <label for="ratings_R">R</label> > </p> > <p> > <input id="ratings_NC-17" name="ratings[NC-17]" type="checkbox" value="NC-17" /> > <label for="ratings_NC-17">NC-17</label> > </p> > <p> > <input id="ratings_X" name="ratings[X]" type="checkbox" value="X" /> > <label for="ratings_X">X</label> > </p> > <p> > <input id="ratings_NR" name="ratings[NR]" type="checkbox" value="NR" /> > <label for="ratings_NR">NR</label> > </p> > > And when that form is submitted, it will appear at the controller as params[:ratings]. If you pass it into your where clause, using IN instead of LIKE, you should get a query like the one I outlined. As a bonus, the checkboxes will maintain their state through a form request. > > Walter > > > > > > > > > > > I''m not sure if this is right but, I think the check_box_tag passes an > > extra parameter "on" in addition to the Ratings and i''m not sure how > > to deal with that. > > > On Mar 13, 12:32 pm, Walter Lee Davis <wa...-HQgmohHLjDZWk0Htik3J/w@public.gmane.org> wrote: > >> On Mar 13, 2012, at 12:21 PM, dasibre wrote: > > >>> rails newbie need help with form. > >>> I have a movie application. In the index I list all the movies and in > >>> addition i have ratings check boxes for (R, PG, PG-13, G) > >>> basically when you check a box and submit, the page should refresh > >>> with movies with the chosen rating. So if you check R,PG; only movies > >>> rated R and PG should be displayed. > >>> At the moment, when i check any box and submit the query seems to work > >>> but no movies are returned. When i checked the log this is what i get. > > >>> Parameters: {"utf8"=>"✓", "ratings"=>{"R"=>"on"}} > >>> Movie Load (0.1ms) SELECT "movies".* FROM "movies" WHERE (rating > >>> LIKE''--- > >>> - R > >>> - ''''on'''' > >>> '') > > >> This looks very much like it''s trying to compare the field with YAML. What is the field type for rating, and have you added serialize to it anywhere? (I don''t see that in your model, but you haven''t quoted all of it.) > > >>> here''s my movie.rb model code. > >>> def self.checkBoxTest(ratings) > >>> if ratings > >>> where(''rating LIKE?'', ratings) > >>> else > >>> scoped > >>> end > >>> end > > >> Instead of LIKE, try IN. You''re trying to compare an array with a single value, if I''m reading this correctly. > > >> If only the R is checked, your params[:ratings] will equal [''R'']. If R and PG are checked, it will look like [''R'',''PG'']. So a query like this in raw SQL would look like SELECT * FROM movies WHERE rating IN (''R'',''PG''); > > >> Walter > > >>> note: using haml for views: > >>> index.html.haml > >>> %h1 All Movies > >>> = form_tag movies_path, :method => :get do > >>> Include: > >>> - @all_ratings.each do |rating| > >>> ="#{rating}" > >>> = check_box_tag "ratings[#{rating}]", params[:ratings] > >>> = submit_tag ''Refresh'', :name => nil > >>> %table#movies > > >>> def index > >>> @movies = Movie.order(sort_column) > >>> @movies = Movie.checkBoxTest(params[:ratings]) > >>> @all_ratings = Movie.find_all_rating > >>> end > >>> here''s my controller index method > > >>> -- > >>> You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. > >>> To post to this group, send email to rubyonrails-talk-/JYPxA39Uh4Ykp1iOSErHA@public.gmane.orgm. > >>> To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org > >>> For more options, visit this group athttp://groups.google.com/group/rubyonrails-talk?hl=en. > > > -- > > You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. > > To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org > > To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org > > For more options, visit this group athttp://groups.google.com/group/rubyonrails-talk?hl=en.-- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.