a hands-on tutoring needed

60 views
Skip to first unread message

sehrguey o.

unread,
Jul 1, 2012, 9:04:16 AM7/1/12
to rubyonra...@googlegroups.com
dear each, and all and others,

being a completeest newbie to RoR and having got dumb by a month or so
of googling how to add search faculty to a web app, I ask you for
help.

All I got is a database of 200 records so there is no need for sphinxes,
sunspots, elasticsearches, searchlogics, ferrets and other highly
esteemed and advanced engines and plugins. Thank you, sir. No.

I humbly ask for a list of files (and their contents) to be added to a
new app for user to get/see table of rows after s/he fills
text_tag_field and clicks submit button.

Don't send me to RailsEpisodes, please, I've sifted them with tons of
other crap.

yours,
sehrguey

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

Bill Walton

unread,
Jul 1, 2012, 9:20:40 AM7/1/12
to rubyonra...@googlegroups.com
Hi Sehrguey,

On Sun, Jul 1, 2012 at 8:04 AM, sehrguey o. <li...@ruby-forum.com> wrote:
> dear each, and all and others,
>
> being a completeest newbie to RoR and having got dumb by a month or so
> of googling how to add search faculty to a web app, I ask you for
> help.
>
> All I got is a database of 200 records so there is no need for sphinxes,
> sunspots, elasticsearches, searchlogics, ferrets and other highly
> esteemed and advanced engines and plugins. Thank you, sir. No.
>

Were these records created with a Rails app? Do you have a basic
Rails app that you're trying to extend with search functionality? Or
do you want to create a Rails app? What you want to do is very
simple. Just trying to understand your starting point.

Best regards,
Bill

Walter Lee Davis

unread,
Jul 1, 2012, 9:26:41 AM7/1/12
to rubyonra...@googlegroups.com

On Jul 1, 2012, at 9:04 AM, sehrguey o. wrote:

> dear each, and all and others,
>
> being a completeest newbie to RoR and having got dumb by a month or so
> of googling how to add search faculty to a web app, I ask you for
> help.
>
> All I got is a database of 200 records so there is no need for sphinxes,
> sunspots, elasticsearches, searchlogics, ferrets and other highly
> esteemed and advanced engines and plugins. Thank you, sir. No.
>
> I humbly ask for a list of files (and their contents) to be added to a
> new app for user to get/see table of rows after s/he fills
> text_tag_field and clicks submit button.

I built something like this as my first paying Rails job, a couple summers ago. I used Paperclip to store the external files in my mode, so to get the content of the text files (in my case, they were PDFs), I used a custom Paperclip processor (based on the Thumbnail processor that comes with Paperclip) to pipe the content of each uploaded file through the venerable pdftotext Unix command. https://gist.github.com/3028403

The results were not good enough to show the world (layout was destroyed) but the text content was extracted into a plain_text attribute on my model, and that's what I searched within.

The very simplest search technique of all is the substring match. This ignores dozens of years of search technology to simply answer the question "is this string present anywhere within that string?" In SQL, it looks like this: "SELECT * FROM `foos` WHERE `bar` LIKE '%baz%'. In Rails 3+, you would write this in your controller like this:

@foos = Foo.where(["bar LIKE '%?%'",params[:q]])

Hope that's enough to get you started. There's also a number of Railscast episodes about this, starting with this humble substring match, and enumerating some simple Gems that can remove the grunt-work for you, like MetaSearch.

Walter

>
> Don't send me to RailsEpisodes, please, I've sifted them with tons of
> other crap.
>
> yours,
> sehrguey
>
> --
> Posted via http://www.ruby-forum.com/.
>
> --
> 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 rubyonra...@googlegroups.com.
> To unsubscribe from this group, send email to rubyonrails-ta...@googlegroups.com.
> For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en-US.
>

sehrguey o.

unread,
Jul 2, 2012, 1:32:31 PM7/2/12
to rubyonra...@googlegroups.com
Hello Bill,

sometime ago I hacked the database structure from Kevin Yank's tutorial
“Build Your Own Database Driven Website Using PHP & MySQL” to use it for
a database at my site and it works OK storing and delivering a hundred
plus of records in the database I needed.

However I haven't deployed it, because of the rumors about the Glossy
Shining Kingdom of RoR that made me wade through a couple of startup
tutorials and Hurtl's Book.

I liked the RoR way but all the tuts I found were about blogs and
cookbooks and twitter-like apps without search funtionality.
How to add this feature to a basic RoR app after generating a model?

Yours`

sehrguey o.

unread,
Jul 2, 2012, 1:42:34 PM7/2/12
to rubyonra...@googlegroups.com
dear Walter,

thank you for your kind attention and readiness to help.

You talked about my controller and proposed an awesomely nice line:

“ @foos = Foo.where(["bar LIKE '%?%'",params[:q]])”

Unfortunately, it is not enough to get me started because I can't
imagine where on earth to stick it into my controller that runs as
follows:

"class DisksController < ApplicationController
# GET /disks
# GET /disks.json
def index
@disks = Disk.search(params[:search])

respond_to do |format|
format.html # index.html.erb
format.json { render json: @disks }
end
end

# GET /disks/1
# GET /disks/1.json
def show
@disk = Disk.find(params[:id])

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

# GET /disks/new
# GET /disks/new.json
def new
@disk = Disk.new

respond_to do |format|
format.html # new.html.erb
format.json { render json: @disk }
end
end

# GET /disks/1/edit
def edit
@disk = Disk.find(params[:id])
end

# POST /disks
# POST /disks.json
def create
@disk = Disk.new(params[:disk])

respond_to do |format|
if @disk.save
format.html { redirect_to @disk, notice: 'Disk was successfully
created.' }
format.json { render json: @disk, status: :created, location:
@disk }
else
format.html { render action: "new" }
format.json { render json: @disk.errors, status:
:unprocessable_entity }
end
end
end

# PUT /disks/1
# PUT /disks/1.json
def update
@disk = Disk.find(params[:id])

respond_to do |format|
if @disk.update_attributes(params[:disk])
format.html { redirect_to @disk, notice: 'Disk was successfully
updated.' }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @disk.errors, status:
:unprocessable_entity }
end
end
end

# DELETE /disks/1
# DELETE /disks/1.json
def destroy
@disk = Disk.find(params[:id])
@disk.destroy

respond_to do |format|
format.html { redirect_to disks_url }
format.json { head :no_content }
end
end
end"

yours`

Walter Lee Davis

unread,
Jul 2, 2012, 1:46:14 PM7/2/12
to rubyonra...@googlegroups.com

On Jul 2, 2012, at 1:42 PM, sehrguey o. wrote:

> dear Walter,
>
> thank you for your kind attention and readiness to help.
>
> You talked about my controller and proposed an awesomely nice line:
>
> “ @foos = Foo.where(["bar LIKE '%?%'",params[:q]])”
>
> Unfortunately, it is not enough to get me started because I can't
> imagine where on earth to stick it into my controller that runs as
> follows:
>
> "class DisksController < ApplicationController
> # GET /disks
> # GET /disks.json
> def index
> @disks = Disk.search(params[:search])

The preceding line is already what I described. You have defined a self.search method in your disk.rb file (or else this line wouldn't work). That seems like you've already got the basics of a search function ready to go. Can I see the content of disk.rb?

Walter

Gregory Bataille

unread,
Jul 3, 2012, 2:29:14 AM7/3/12
to rubyonra...@googlegroups.com
Did you watch this one 
for a search without plugins, I think it covers well the basics of the subject to let you improve it.

this is the "advanced search form" episode.
If you were to find yourself a bit lost, there is a "simple search form one"

(those are old episode in rails 1 or rails 2, so there is a little bit of transcription to make, but it should be pretty easy to follow still)
> To post to this group, send email to rubyonrails-talk@googlegroups.com.
> To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com.

sehrguey o.

unread,
Jul 3, 2012, 1:16:01 PM7/3/12
to rubyonra...@googlegroups.com
Walter,
here is the contents of my disk.rb
-----------
class Disk < ActiveRecord::Base
attr_accessible :director, :language, :notes, :starring, :title,
:volume_name, :wrapper

def self.search(search)
if search
find(:all, :condition=>['name LIKE ?', "%#{search}%"])
else
find(:all)
end
end
end
------------

yours`

sehrguey o.

unread,
Jul 3, 2012, 1:23:19 PM7/3/12
to rubyonra...@googlegroups.com
dear Gregory,

I watched both episodes you mentioned, they did not work for me, I
couldn't figure out where the views come into play, which model stores
the searched items and what is in the controller of that invisible
model.

yours`

Walter Lee Davis

unread,
Jul 3, 2012, 3:23:59 PM7/3/12
to rubyonra...@googlegroups.com

On Jul 3, 2012, at 1:16 PM, sehrguey o. wrote:

> Walter,
> here is the contents of my disk.rb
> -----------
> class Disk < ActiveRecord::Base
> attr_accessible :director, :language, :notes, :starring, :title,
> :volume_name, :wrapper
>
> def self.search(search)
> if search
> find(:all, :condition=>['name LIKE ?', "%#{search}%"])
> else
> find(:all)
> end
> end
> end
> ------------

This is putting the search method where it belongs, in the model, rather than inline in the controller, as I had it. Completely identical in every functional way, just better MVC layout this way. So the only other question here is, do you have a form on your index page layout that can set a params[:search] with the desired search term? If you've looked at the RailsCast, there's a nice easy snippet there to make it with the form_tag helper (useful because you don't have an associated model). Can you show that code here?

You want to issue a GET request from the form to the index method, and then this will all just work. Your self.search method will default to gathering all records, because the query is 'WHERE name LIKE "%%"', which matches everything in the table. When you do pass a querystring to it that's like ?search=foo, then you will get the records where name contains foo. This means that there's no need for an additional controller method or a separate route or template for search results. If you do want to specialize the results page, you could do something in the index.html.erb template to switch on the presence of a params[:search] variable, and use that to change the page title or header or both.

Walter

>
> yours`
> sehrguey
>
> --
> Posted via http://www.ruby-forum.com/.
>
> --
> 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 rubyonra...@googlegroups.com.
> To unsubscribe from this group, send email to rubyonrails-ta...@googlegroups.com.

sehrguey o.

unread,
Jul 4, 2012, 3:03:55 PM7/4/12
to rubyonra...@googlegroups.com
Hi Walter,

there is form_tag in the index view`
-------------
<br />
<div>
<%= form_tag disks_path, :method => 'get' do %>
<p>
<%= text_field_tag :search, params[:search] %>
<%= submit_tag "Search", :name => nil %>
</p>
<% end %>

</div>

<%= link_to 'New Disk', new_disk_path %>
--------------

but when I try to put it to use it raises
"ArgumentError in DisksController#index
Unknown key: condition".
I can read the message yet I don't know what to do.

yours`

Walter Lee Davis

unread,
Jul 4, 2012, 3:10:23 PM7/4/12
to rubyonra...@googlegroups.com
Make that :conditions rather than :condition, and you're done.

Walter

sehrguey o.

unread,
Jul 5, 2012, 2:47:01 PM7/5/12
to rubyonra...@googlegroups.com
thank you, Walter,

it worked after I had corrected the shameful typo and replaced 'name'
with 'title'further along the line.

I feel embarrassed and obliged or, maybe, vice verse.

gratefully yours`

sehrguey o.

unread,
Jul 6, 2012, 2:52:20 PM7/6/12
to rubyonra...@googlegroups.com
happy moments are too short...

the search form worked and still works but it has a major flaw - when
the text_field_tag is left blank then all the db raws pop up on hitting
submit button.
How to prevent it?

I tried to substitute 'if (search.present?)' for just 'if search' in
disk.rb (the googled out trick seemed so logical) yet it availed of
nothing and all the records were displayed again.

Now what?

yours`

Javier Quarite

unread,
Jul 6, 2012, 4:38:17 PM7/6/12
to rubyonra...@googlegroups.com
This is why you are getting all the records, if there's no "search" then it will find all the records.

    else
      find(:all)
    end 

You can send an empty array or whatever you want, or maybe you can handle that in the controller

Javier Q.

Walter Lee Davis

unread,
Jul 6, 2012, 5:19:52 PM7/6/12
to rubyonra...@googlegroups.com
Your controller is using this method to load results on your index page, whether or not any search was performed. So it's perfectly reasonable for the empty search to return all results.

def self.search(search)
if search
find(:all, :conditions=>['name LIKE ?', "%#{search}%"])
else
find(:all)
end
end
end

def index
@disks = Disk.search(params[:search]) # <-- right here

respond_to do |format|
format.html # index.html.erb
format.json { render json: @disks }
end
end

If you kink the self.search method to only return results if there is a non-empty search request, then you will never see anything on your normal index view unless a search request has been entered.

You could kink the form to only submit if there is a value in the search field, you would do that with JavaScript. Something like this (inline) or better you would use Prototype or jQuery to write an unobtrusive handler.

<%= form_tag disks_path, :method => 'get', :onsubmit => "return (this.search.value != '')" do %>

Walter

sehrguey o.

unread,
Jul 8, 2012, 2:33:44 AM7/8/12
to rubyonra...@googlegroups.com
Javier Quarite wrote in post #1067748:

> You can send an empty array or whatever you want, or maybe you can
> handle
> that in the controller

Walter Davis wrote:

>You could kink the form to only submit if there is a value in the search
>field, you would do that with JavaScript. Something like this (inline)
>or better you would use Prototype or jQuery to write an unobtrusive
>handler.

O weh, dear sirs,

If I could I would but before I should know the way to. Presently I
consider your enlightened talk with awe like some heaven dwellers'
parlance incomprehensible for mere mortals.
OK. I asked Google about sending arrays in rails and got another bowl of
geek-talk and changed 'else find(:all)' to whatever I wanted just to be
punished for transgressions of convention over configuration.
Then I added unobtrusive addition to form_tag which seasoning brought no
changes to conventional displaying of everything not searched for.

Of course, RoR has means and ways to solve a petty problem like this
one. The only queston is` 'where to discover?'

Colin Law

unread,
Jul 8, 2012, 3:56:43 AM7/8/12
to rubyonra...@googlegroups.com
I would start by working right through some good Ruby tutorials (to
understand the language better) and also through some good Rails
tutorials (railstutorial.org is good and is free to use online) to
understand the Rails magic. Take a week out to do that and then you
should be good to tackle a multitude of problems.

Also monitor this list. Any time that you understand the question
then follow the replies and attempt to understand the answers. That
way you will learn a lot. In no time you will find yourself answering
questions.

Colin

sehrguey o.

unread,
Jul 8, 2012, 12:59:19 PM7/8/12
to rubyonra...@googlegroups.com
Colin Law wrote in post #1067862:

> I would start by working right through some good Ruby tutorials (to
> understand the language better) and also through some good Rails
> tutorials (railstutorial.org is good and is free to use online) to
> understand the Rails magic.

thank you Colin,

you are right railstutorial.org is outright good and I did all of it.
Unfortunately, it has no search form whatsoever. Neither do intensely
good tutorials at guides.rubyonrails.org/getting_started.html

That's why I knocked at this here forum asking for help of those who
understand the language and the Rails better.
Reply all
Reply to author
Forward
0 new messages