Todd Chambery
2008-Jun-13 18:27 UTC
Two text_field_with_auto_complete field with the same search content
Hi all,
I have a form with two text_field_with_auto_complete s, both of which
do a lookup from the same table:
<!-- good guys --><td><%text_field_with_auto_complete
:person, :name %></td>
<!-- bad guys --><td><%text_field_with_auto_complete
:person, :name %></td>
Unsurprisingly, this produces identical output for both:
<input id="person_name" name="person[name]"
size="30"
type="text" />
Is there a way to set the id of the field to something other than the
default?
Thanks,
Todd
--~--~---------~--~----~------------~-------~--~----~
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-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---
julian
2008-Jun-13 19:12 UTC
Re: Two text_field_with_auto_complete field with the same search content
text_field_with_auto_complete(object, method, tag_options = {},
completion_options = {})
Well, you can change the id with the tag_options hash, but the
generated javascript won''t know about it. So, let''s improve
text_field_with_auto_complete so that it does work.
def text_field_with_auto_complete(object, method, tag_options = {},
completion_options = {})
(completion_options[:skip_style] ? "" : auto_complete_stylesheet) +
text_field(object, method, tag_options) +
content_tag("div", "", :id =>
"#{object}_#{method}_auto_complete", :class =>
"auto_complete") +
auto_complete_field("#{object}_#{method}",
{ :url => { :action =>
"auto_complete_for_#{object}_#{method}" }
}.update(completion_options))
end
The content_tag and the auto_complete_field methods both set the ids
of elements without consulting what id you passed to the tag_options
hash. We should change those two calls to match whatever :id option
was passed in, if in case it was passed in.
So...
def text_field_with_auto_complete_with_id_checking(object, method,
tag_options = {}, completion_options = {})
# lets just set the id now and not worry about it throughout
id = tag_options[:id] || "#{object}_#{method}"
(completion_options[:skip_style] ? "" : auto_complete_stylesheet) +
text_field(object, method, tag_options) +
content_tag("div", "", :id =>
"#{id}_auto_complete", :class =>
"auto_complete") +
auto_complete_field(id,
{ :url => { :action =>
"auto_complete_for_#{object}_#{method}" }
}.update(completion_options))
end
To get this to work just place it in your application_helper.rb (and
call it with
text_field_with_auto_complete_with_id_checking(:person, :name, {:id =>
''bad_person''})
This seems to work for me but it doesn''t have any tests written for it
as I just threw it together... I''ll leave that to someone else.
Julian
On Jun 13, 2:27 pm, Todd Chambery
<todd.chamb...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
wrote:> Hi all,
>
> I have a form with two text_field_with_auto_complete s, both of which
> do a lookup from the same table:
>
> <!-- good guys --><td><%>
text_field_with_auto_complete :person, :name %></td>
> <!-- bad guys --><td><%>
text_field_with_auto_complete :person, :name %></td>
>
> Unsurprisingly, this produces identical output for both:
>
> <input id="person_name"
name="person[name]" size="30"
> type="text" />
>
> Is there a way to set the id of the field to something other than the
> default?
>
> Thanks,
>
> Todd
--~--~---------~--~----~------------~-------~--~----~
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-/JYPxA39Uh5TLH3MbocFFw@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
-~----------~----~----~----~------~----~------~--~---
Todd Chambery
2008-Jun-14 14:20 UTC
Re: Two text_field_with_auto_complete field with the same search content
Brilliant! That works a treat.
So a follow on question:
How do I get access to the completion_options in my view? I need to
add some conditions to the search in my person controller ("filter on
org")?
view:
<!-- good guys --><td><%text_field_with_auto_complete
:person, :name, { :id => ''goodguy'' }
{ :org => "justice_league" } %></td>
<!-- bad guys --><td><%text_field_with_auto_complete
:person, :name, { :id => ''badguy'' }
{ :org => "legion_of_doom" } %></td>
controller:
def auto_complete_for_person_name
...
find_options = { :conditions => "org=''" + ??????
+
"''", :order => "name ASC" }
@entities = Person.find(:all,
find_options).collect(&:name).select { |person| person.match re }
As an aside: coming from Java (and Eclipse), the hardest part of
picking up Rails is the lack of a "discoverable API". If you have any
pointers (books, links, etc), I''d be much obliged.
Thanks again,
Todd
On Jun 13, 3:12 pm, julian
<thefool...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
wrote:> text_field_with_auto_complete(object, method, tag_options = {},
> completion_options = {})
>
> Well, you can change the id with the tag_options hash, but the
> generated javascript won''t know about it. So, let''s
improve
> text_field_with_auto_complete so that it does work.
>
> def text_field_with_auto_complete(object, method, tag_options = {},
> completion_options = {})
> (completion_options[:skip_style] ? "" :
auto_complete_stylesheet) +
> text_field(object, method, tag_options) +
> content_tag("div", "", :id =>
> "#{object}_#{method}_auto_complete", :class =>
"auto_complete") +
> auto_complete_field("#{object}_#{method}",
> { :url => { :action =>
> "auto_complete_for_#{object}_#{method}" }
}.update(completion_options))
> end
>
> The content_tag and the auto_complete_field methods both set the ids
> of elements without consulting what id you passed to the tag_options
> hash. We should change those two calls to match whatever :id option
> was passed in, if in case it was passed in.
>
> So...
>
> def text_field_with_auto_complete_with_id_checking(object, method,
> tag_options = {}, completion_options = {})
> # lets just set the id now and not worry about it throughout
> id = tag_options[:id] || "#{object}_#{method}"
>
> (completion_options[:skip_style] ? "" :
auto_complete_stylesheet) +
> text_field(object, method, tag_options) +
> content_tag("div", "", :id =>
"#{id}_auto_complete", :class =>
> "auto_complete") +
> auto_complete_field(id,
> { :url => { :action =>
> "auto_complete_for_#{object}_#{method}" }
}.update(completion_options))
> end
>
> To get this to work just place it in your application_helper.rb (and
> call it with
> text_field_with_auto_complete_with_id_checking(:person, :name, {:id =>
> ''bad_person''})
>
> This seems to work for me but it doesn''t have any tests written
for it
> as I just threw it together... I''ll leave that to someone else.
>
> Julian
>
> On Jun 13, 2:27 pm, Todd Chambery
<todd.chamb...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:
>
> > Hi all,
>
> > I have a form with two text_field_with_auto_complete s, both of which
> > do a lookup from the same table:
>
> > <!-- good guys --><td><%> >
text_field_with_auto_complete :person, :name %></td>
> > <!-- bad guys --><td><%> >
text_field_with_auto_complete :person, :name %></td>
>
> > Unsurprisingly, this produces identical output for both:
>
> > <input id="person_name"
name="person[name]" size="30"
> > type="text" />
>
> > Is there a way to set the id of the field to something other than the
> > default?
>
> > Thanks,
>
> > Todd
--~--~---------~--~----~------------~-------~--~----~
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-/JYPxA39Uh5TLH3MbocFFw@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
-~----------~----~----~----~------~----~------~--~---
julian
2008-Jun-14 20:09 UTC
Re: Two text_field_with_auto_complete field with the same search content
One of the completion_options is :with. If you don''t use the :with
option the default parameter available to the action is the value of
the text field. However, once you do use the :with option you have to
specify all the parameters available to the action including the one
that was sent by default (the "''person[name]='' +
$(''goodguy'').value"
part).
text_field_with_auto_complete :person, :name, { :id =>
''goodguy'' }
{ :with => "''person[name]='' +
$(''goodguy'').value +
''&person[org]=justice_league''"}
What''s a "discoverable API"?
I just use api.rubyonrails.org
On Jun 14, 10:20 am, Todd Chambery
<todd.chamb...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
wrote:> Brilliant! That works a treat.
>
> So a follow on question:
>
> How do I get access to the completion_options in my view? I need to
> add some conditions to the search in my person controller ("filter on
> org")?
>
> view:
> <!-- good guys --><td><%>
text_field_with_auto_complete :person, :name, { :id =>
''goodguy'' }
> { :org => "justice_league" } %></td>
> <!-- bad guys --><td><%>
text_field_with_auto_complete :person, :name, { :id =>
''badguy'' }
> { :org => "legion_of_doom" } %></td>
>
> controller:
> def auto_complete_for_person_name
> ...
> find_options = { :conditions => "org=''" +
?????? +
> "''", :order => "name ASC" }
> @entities = Person.find(:all,
> find_options).collect(&:name).select { |person| person.match re }
>
> As an aside: coming from Java (and Eclipse), the hardest part of
> picking up Rails is the lack of a "discoverable API". If you
have any
> pointers (books, links, etc), I''d be much obliged.
>
> Thanks again,
>
> Todd
>
> On Jun 13, 3:12 pm, julian
<thefool...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:
>
> > text_field_with_auto_complete(object, method, tag_options = {},
> > completion_options = {})
>
> > Well, you can change the id with the tag_options hash, but the
> > generated javascript won''t know about it. So, let''s
improve
> > text_field_with_auto_complete so that it does work.
>
> > def text_field_with_auto_complete(object, method, tag_options = {},
> > completion_options = {})
> > (completion_options[:skip_style] ? "" :
auto_complete_stylesheet) +
> > text_field(object, method, tag_options) +
> > content_tag("div", "", :id =>
> > "#{object}_#{method}_auto_complete", :class =>
"auto_complete") +
> > auto_complete_field("#{object}_#{method}",
> > { :url => { :action =>
> > "auto_complete_for_#{object}_#{method}" }
}.update(completion_options))
> > end
>
> > The content_tag and the auto_complete_field methods both set the ids
> > of elements without consulting what id you passed to the tag_options
> > hash. We should change those two calls to match whatever :id option
> > was passed in, if in case it was passed in.
>
> > So...
>
> > def text_field_with_auto_complete_with_id_checking(object, method,
> > tag_options = {}, completion_options = {})
> > # lets just set the id now and not worry about it throughout
> > id = tag_options[:id] || "#{object}_#{method}"
>
> > (completion_options[:skip_style] ? "" :
auto_complete_stylesheet) +
> > text_field(object, method, tag_options) +
> > content_tag("div", "", :id =>
"#{id}_auto_complete", :class =>
> > "auto_complete") +
> > auto_complete_field(id,
> > { :url => { :action =>
> > "auto_complete_for_#{object}_#{method}" }
}.update(completion_options))
> > end
>
> > To get this to work just place it in your application_helper.rb (and
> > call it with
> > text_field_with_auto_complete_with_id_checking(:person, :name, {:id
=>
> > ''bad_person''})
>
> > This seems to work for me but it doesn''t have any tests
written for it
> > as I just threw it together... I''ll leave that to someone
else.
>
> > Julian
>
> > On Jun 13, 2:27 pm, Todd Chambery
<todd.chamb...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:
>
> > > Hi all,
>
> > > I have a form with two text_field_with_auto_complete s, both of
which
> > > do a lookup from the same table:
>
> > > <!-- good guys --><td><%> >
> text_field_with_auto_complete :person, :name %></td>
> > > <!-- bad guys --><td><%> >
> text_field_with_auto_complete :person, :name %></td>
>
> > > Unsurprisingly, this produces identical output for both:
>
> > > <input id="person_name"
name="person[name]" size="30"
> > > type="text" />
>
> > > Is there a way to set the id of the field to something other than
the
> > > default?
>
> > > Thanks,
>
> > > Todd
--~--~---------~--~----~------------~-------~--~----~
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-/JYPxA39Uh5TLH3MbocFFw@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
-~----------~----~----~----~------~----~------~--~---
Todd Chambery
2008-Jun-14 21:03 UTC
Re: Two text_field_with_auto_complete field with the same search content
On Jun 14, 4:09 pm, julian <thefool...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> One of the completion_options is :with. If you don''t use the :with > option the default parameter available to the action is the value of > the text field. However, once you do use the :with option you have to > specify all the parameters available to the action including the one > that was sent by default (the "''person[name]='' + $(''goodguy'').value" > part). > > text_field_with_auto_complete :person, :name, { :id => ''goodguy'' } > { :with => "''person[name]='' + $(''goodguy'').value + > ''&person[org]=justice_league''"}Thanks again! Once again, this did the trick.> What''s a "discoverable API"? > > I just use api.rubyonrails.orgNot to send this thread spinning off into another universe, but: it seems that in a number of Rails methods, one or more arguments is a Hash. No problem with it in principle, but it''s not transparent ("discoverable") from the signature what values will do what. For comparison, with Java + Eclipse, it''s clear what data should be sent to the method. I''m quite enamored with Rails, but this point is the hardest adjustment coming from a statically-typed language. Todd> > On Jun 14, 10:20 am, Todd Chambery <todd.chamb...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > > > Brilliant! That works a treat. > > > So a follow on question: > > > How do I get access to the completion_options in my view? I need to > > add some conditions to the search in my person controller ("filter on > > org")? > > > view: > > <!-- good guys --><td><%> > text_field_with_auto_complete :person, :name, { :id => ''goodguy'' } > > { :org => "justice_league" } %></td> > > <!-- bad guys --><td><%> > text_field_with_auto_complete :person, :name, { :id => ''badguy'' } > > { :org => "legion_of_doom" } %></td> > > > controller: > > def auto_complete_for_person_name > > ... > > find_options = { :conditions => "org=''" + ?????? + > > "''", :order => "name ASC" } > > @entities = Person.find(:all, > > find_options).collect(&:name).select { |person| person.match re } > > > As an aside: coming from Java (and Eclipse), the hardest part of > > picking up Rails is the lack of a "discoverable API". If you have any > > pointers (books, links, etc), I''d be much obliged. > > > Thanks again, > > > Todd > > > On Jun 13, 3:12 pm, julian <thefool...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > > > > text_field_with_auto_complete(object, method, tag_options = {}, > > > completion_options = {}) > > > > Well, you can change the id with the tag_options hash, but the > > > generated javascript won''t know about it. So, let''s improve > > > text_field_with_auto_complete so that it does work. > > > > def text_field_with_auto_complete(object, method, tag_options = {}, > > > completion_options = {}) > > > (completion_options[:skip_style] ? "" : auto_complete_stylesheet) + > > > text_field(object, method, tag_options) + > > > content_tag("div", "", :id => > > > "#{object}_#{method}_auto_complete", :class => "auto_complete") + > > > auto_complete_field("#{object}_#{method}", > > > { :url => { :action => > > > "auto_complete_for_#{object}_#{method}" } }.update(completion_options)) > > > end > > > > The content_tag and the auto_complete_field methods both set the ids > > > of elements without consulting what id you passed to the tag_options > > > hash. We should change those two calls to match whatever :id option > > > was passed in, if in case it was passed in. > > > > So... > > > > def text_field_with_auto_complete_with_id_checking(object, method, > > > tag_options = {}, completion_options = {}) > > > # lets just set the id now and not worry about it throughout > > > id = tag_options[:id] || "#{object}_#{method}" > > > > (completion_options[:skip_style] ? "" : auto_complete_stylesheet) + > > > text_field(object, method, tag_options) + > > > content_tag("div", "", :id => "#{id}_auto_complete", :class => > > > "auto_complete") + > > > auto_complete_field(id, > > > { :url => { :action => > > > "auto_complete_for_#{object}_#{method}" } }.update(completion_options)) > > > end > > > > To get this to work just place it in your application_helper.rb (and > > > call it with > > > text_field_with_auto_complete_with_id_checking(:person, :name, {:id => > > > ''bad_person''}) > > > > This seems to work for me but it doesn''t have any tests written for it > > > as I just threw it together... I''ll leave that to someone else. > > > > Julian > > > > On Jun 13, 2:27 pm, Todd Chambery <todd.chamb...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > > > > > Hi all, > > > > > I have a form with two text_field_with_auto_complete s, both of which > > > > do a lookup from the same table: > > > > > <!-- good guys --><td><%> > > > text_field_with_auto_complete :person, :name %></td> > > > > <!-- bad guys --><td><%> > > > text_field_with_auto_complete :person, :name %></td> > > > > > Unsurprisingly, this produces identical output for both: > > > > > <input id="person_name" name="person[name]" size="30" > > > > type="text" /> > > > > > Is there a way to set the id of the field to something other than the > > > > default? > > > > > Thanks, > > > > > Todd--~--~---------~--~----~------------~-------~--~----~ 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-/JYPxA39Uh5TLH3MbocFFw@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 -~----------~----~----~----~------~----~------~--~---
Xavier Noria
2008-Jun-14 22:32 UTC
Re: Two text_field_with_auto_complete field with the same search content
On Sat, Jun 14, 2008 at 11:03 PM, Todd Chambery <todd.chambery-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> Not to send this thread spinning off into another universe, but: it > seems that in a number of Rails methods, one or more arguments is a > Hash. No problem with it in principle, but it''s not transparent > ("discoverable") from the signature what values will do what. For > comparison, with Java + Eclipse, it''s clear what data should be sent > to the method. > > I''m quite enamored with Rails, but this point is the hardest > adjustment coming from a statically-typed language.It''s quite easy once you understand how it works. As syntactic sugar Ruby builds a single hash from any trailing hash-like arguments and passes *it* as the corresponding positional argument. For example in def foo(x, y=0) ... end the call foo(:a => 1, :b => 2, :c => 3) is equivalent to foo({:a => 1, :b => 2, :c => 3}) and both of them result in x = {:a => 1, :b => 2, :c => 3} y = 0 In that situation, how can you pass a -7 for y? You have to make explicit the 1st argument: foo({:a => 1, :b => 2, :c => 3}, -7) That''s the basic stuff. Other than that what you need to do with those helpers, as with any other API, is to read its documentation. In particular their signature. --~--~---------~--~----~------------~-------~--~----~ 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-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Todd Chambery
2008-Jun-16 12:55 UTC
Re: Two text_field_with_auto_complete field with the same search content
After some further tinkering, I''m able to get
''goodguy'' and ''badguy''
values passed to the controller (the ''method per id'' is far
from
ideal....):
entry.rhtml
<p>
<label for="attr_badguy_name">Bad Guy:</label>
<%text_field_with_auto_complete_with_id_checking :entity, :name,
{ :id
=> "badguy" }, { :with =>
"''badguy[name]='' + $(''badguy'').value +
''&entity[schema_type]=complex''"} %>
</p>
<p>
<label for="attr_type_name">Good Guy:</label>
<%text_field_with_auto_complete_with_id_checking :goodguy, :name,
{ :id
=> "goodguy" }, { :with =>
"''goodguy[name]='' +
$(''goodguy'').value" }
%>
</p>
--------------------
module ApplicationHelper
def text_field_with_auto_complete_with_id_checking(object, method,
tag_options = {},
completion_options = {})
# lets just set the id now and not worry about it throughout
id = tag_options[:id] || "#{object}_#{method}"
print "\n\n\n\t\t"
pp id
(completion_options[:skip_style] ? "" : auto_complete_stylesheet)
+
text_field(id, method, tag_options) +
content_tag("div", "", :id =>
"#{id}_auto_complete", :class
=>"auto_complete") +
auto_complete_field(id, { :url => { :action =>
"auto_complete_for_#{id}_#{method}" } }.update(completion_options))
end
--------------------
class AttrController < ApplicationController
protect_from_forgery :only => [:create, :update, :destroy]
def auto_complete_for_goodguy_name
print "\n\n\t\tin auto_complete_for_goodguy_name\n"
pp params
org = params[:person][:org].nil? ? "" : "org=''"
+ params[:person]
[:org] + "''"
re = Regexp.new("^#{params[:goodguy][:name]}", "i")
find_options = { :conditions => org, :order => "name ASC" }
@people = Person.find(:all, find_options).collect(&:name).select
{ |person| person.match re }
render :inline => "<%= content_tag(:ul, @people.map { |person|
content_tag(:li, h(person)) }) %>"
end
def auto_complete_for_badguy_name
print "\n\n\t\tin auto_complete_for_badguy_name\n"
pp params
org = params[:person][:org].nil? ? "" : "org=''"
+ params[:person]
[:org] + "''"
re = Regexp.new("^#{params[:badguy][:name]}", "i")
find_options = { :conditions => org, :order => "name ASC" }
@people = Person.find(:all, find_options).collect(&:name).select
{ |person| person.match re }
render :inline => "<%= content_tag(:ul, @people.map { |person|
content_tag(:li, h(person)) }) %>"
end
On Jun 14, 4:09 pm, julian
<thefool...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
wrote:> One of the completion_options is :with. If you don''t use the
:with
> option the default parameter available to the action is the value of
> the text field. However, once you do use the :with option you have to
> specify all the parameters available to the action including the one
> that was sent by default (the "''person[name]='' +
$(''goodguy'').value"
> part).
>
> text_field_with_auto_complete :person, :name, { :id =>
''goodguy'' }
> { :with => "''person[name]='' +
$(''goodguy'').value +
> ''&person[org]=justice_league''"}
>
> What''s a "discoverable API"?
>
> I just use api.rubyonrails.org
>
> On Jun 14, 10:20 am, Todd Chambery
<todd.chamb...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:
>
> > Brilliant! That works a treat.
>
> > So a follow on question:
>
> > How do I get access to the completion_options in my view? I need to
> > add some conditions to the search in my person controller
("filter on
> > org")?
>
> > view:
> > <!-- good guys --><td><%> >
text_field_with_auto_complete :person, :name, { :id =>
''goodguy'' }
> > { :org => "justice_league" } %></td>
> > <!-- bad guys --><td><%> >
text_field_with_auto_complete :person, :name, { :id =>
''badguy'' }
> > { :org => "legion_of_doom" } %></td>
>
> > controller:
> > def auto_complete_for_person_name
> > ...
> > find_options = { :conditions => "org=''"
+ ?????? +
> > "''", :order => "name ASC" }
> > @entities = Person.find(:all,
> > find_options).collect(&:name).select { |person| person.match re }
>
> > As an aside: coming from Java (and Eclipse), the hardest part of
> > picking up Rails is the lack of a "discoverable API". If
you have any
> > pointers (books, links, etc), I''d be much obliged.
>
> > Thanks again,
>
> > Todd
>
> > On Jun 13, 3:12 pm, julian
<thefool...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:
>
> > > text_field_with_auto_complete(object, method, tag_options = {},
> > > completion_options = {})
>
> > > Well, you can change the id with the tag_options hash, but the
> > > generated javascript won''t know about it. So,
let''s improve
> > > text_field_with_auto_complete so that it does work.
>
> > > def text_field_with_auto_complete(object, method, tag_options =
{},
> > > completion_options = {})
> > > (completion_options[:skip_style] ? "" :
auto_complete_stylesheet) +
> > > text_field(object, method, tag_options) +
> > > content_tag("div", "", :id =>
> > > "#{object}_#{method}_auto_complete", :class =>
"auto_complete") +
> > > auto_complete_field("#{object}_#{method}",
> > > { :url => { :action =>
> > > "auto_complete_for_#{object}_#{method}" }
}.update(completion_options))
> > > end
>
> > > The content_tag and the auto_complete_field methods both set the
ids
> > > of elements without consulting what id you passed to the
tag_options
> > > hash. We should change those two calls to match whatever :id
option
> > > was passed in, if in case it was passed in.
>
> > > So...
>
> > > def text_field_with_auto_complete_with_id_checking(object,
method,
> > > tag_options = {}, completion_options = {})
> > > # lets just set the id now and not worry about it throughout
> > > id = tag_options[:id] || "#{object}_#{method}"
>
> > > (completion_options[:skip_style] ? "" :
auto_complete_stylesheet) +
> > > text_field(object, method, tag_options) +
> > > content_tag("div", "", :id =>
"#{id}_auto_complete", :class =>
> > > "auto_complete") +
> > > auto_complete_field(id,
> > > { :url => { :action =>
> > > "auto_complete_for_#{object}_#{method}" }
}.update(completion_options))
> > > end
>
> > > To get this to work just place it in your application_helper.rb
(and
> > > call it with
> > > text_field_with_auto_complete_with_id_checking(:person, :name,
{:id =>
> > > ''bad_person''})
>
> > > This seems to work for me but it doesn''t have any tests
written for it
> > > as I just threw it together... I''ll leave that to
someone else.
>
> > > Julian
>
> > > On Jun 13, 2:27 pm, Todd Chambery
<todd.chamb...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:
>
> > > > Hi all,
>
> > > > I have a form with two text_field_with_auto_complete s, both
of which
> > > > do a lookup from the same table:
>
> > > > <!-- good guys --><td><%>
> > > text_field_with_auto_complete :person, :name %></td>
> > > > <!-- bad guys --><td><%>
> > > text_field_with_auto_complete :person, :name %></td>
>
> > > > Unsurprisingly, this produces identical output for both:
>
> > > > <input id="person_name"
name="person[name]" size="30"
> > > > type="text" />
>
> > > > Is there a way to set the id of the field to something other
than the
> > > > default?
>
> > > > Thanks,
>
> > > > Todd
--~--~---------~--~----~------------~-------~--~----~
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-/JYPxA39Uh5TLH3MbocFFw@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
-~----------~----~----~----~------~----~------~--~---
Frederick Cheung
2008-Jun-16 13:02 UTC
Re: Two text_field_with_auto_complete field with the same search content
On 16 Jun 2008, at 13:55, Todd Chambery wrote:> > After some further tinkering, I''m able to get ''goodguy'' and ''badguy'' > values passed to the controller (the ''method per id'' is far from > ideal....): >don''t forget to use encodeURIComponent or bad things will happen if you type & into the box. Fred> entry.rhtml > > <p> > <label for="attr_badguy_name">Bad Guy:</label> > <%> text_field_with_auto_complete_with_id_checking :entity, :name, { :id > => "badguy" }, { :with => "''badguy[name]='' + $(''badguy'').value + > ''&entity[schema_type]=complex''"} %> > </p> > <p> > <label for="attr_type_name">Good Guy:</label> > <%> text_field_with_auto_complete_with_id_checking :goodguy, :name, { :id > => "goodguy" }, { :with => "''goodguy[name]='' + $(''goodguy'').value" } > %> > </p> > >--~--~---------~--~----~------------~-------~--~----~ 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-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
julian
2008-Jun-16 13:49 UTC
Re: Two text_field_with_auto_complete field with the same search content
A couple of suggestions:
First, you''ll be better of using the database to search through the
names for matches as that should be faster then pulling all the names
and running them through a regular expression. You can use
a :conditions option to the ActiveRecord::Base.find method like this
(works with mysql, though I think it''s standard SQL) :conditions =>
["name LIKE ?", "#{name}%"]. The LIKE will match case
insensitive and
allows the wildcard character (the percent sign) and the placeholder
substitution will prevent sql injection attacks.
Second, I think the point of my hack to text_field_with_auto_complete
was to allow the controller to have one method. So you could have
just auto_complete_for_person_name where it''s something like this.
def auto_complete_for_person_name
@people = Person.find(:all,
:conditions => ["name LIKE ? AND org = ?",
"#{params[:person]
[:name]}%", params[:person][:org]],
:order => "name ASC")
unless @people.blank?
render :inline => "<%= content_tag(:ul,
@people.map{|person|
content_tag(:li, h(person)) }) %>"
else
render :inline => ""
end
end
Assuming you always pass the [person][org] parameter, which you don''t
seem to be doing anymore.
Also, Frederick''s point is very important! (My mistake)
So the final text_field_with_auto_complete_with_id_checking call
should look like this:
text_field_with_auto_complete_with_id_checking :person, :name, {:id =>
"badguy"},
{:with => "''person[name]='' +
encodeURIComponent($(''badguy'').value) +
''&person[org]=legion_of_doom''"}
Finally, in your controller you will want to make sure that @people is
not blank before sending it to map to avoid:
NoMethodError: undefined method `map'' for nil:NilClass
so:
unless @people.blank?
render ...
else
render :inline => ""
end
If you do need two different controller methods for some other reason
then you should still take the similar stuff and stick it in a helper
or private method.
Julian
On Jun 16, 9:02 am, Frederick Cheung
<frederick.che...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
wrote:> On 16 Jun 2008, at 13:55, Todd Chambery wrote:
>
>
>
> > After some further tinkering, I''m able to get
''goodguy'' and ''badguy''
> > values passed to the controller (the ''method per id''
is far from
> > ideal....):
>
> don''t forget to use encodeURIComponent or bad things will happen
if
> you type & into the box.
>
> Fred
>
> > entry.rhtml
>
> > <p>
> > <label for="attr_badguy_name">Bad
Guy:</label>
> > <%> >
text_field_with_auto_complete_with_id_checking :entity, :name, { :id
> > => "badguy" }, { :with =>
"''badguy[name]='' + $(''badguy'').value +
> > ''&entity[schema_type]=complex''"} %>
> > </p>
> > <p>
> > <label for="attr_type_name">Good
Guy:</label>
> > <%> >
text_field_with_auto_complete_with_id_checking :goodguy, :name, { :id
> > => "goodguy" }, { :with =>
"''goodguy[name]='' +
$(''goodguy'').value" }
> > %>
> > </p>
--~--~---------~--~----~------------~-------~--~----~
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-/JYPxA39Uh5TLH3MbocFFw@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
-~----------~----~----~----~------~----~------~--~---
Todd Chambery
2008-Jun-16 15:18 UTC
Re: Two text_field_with_auto_complete field with the same search content
Julian,
Your solution works for providing and filtering the completion
suggestions. The problem I''m running into is what params get sent on
submit:
Parameters: {"commit"=>"Add People",
"person"=>{"name"=>"Superman"},
"authenticity_token"=>"033d880da069739bd1b80f42e11c6008e
54971b9", "action"=>"save_matchup",
"controller"=>"matchup",
"matchup"=>{"name"=>"foo",
"description"=>"sdafasdf"}}
In this case, "Superman" is the value in the first text field. The
generated HTML reveals that both text auto-complete boxes have the
same name:
<input autocomplete="off" id="goodguy"
name="person[name]" ...
<input autocomplete="off" id="badguy"
name="person[name]" ...
It looks like I need a unique "name" attribute as well as a unique id
(if I actually need a unique id at all).
Todd
On Jun 16, 9:49 am, julian
<thefool...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
wrote:> A couple of suggestions:
>
> First, you''ll be better of using the database to search through
the
> names for matches as that should be faster then pulling all the names
> and running them through a regular expression. You can use
> a :conditions option to the ActiveRecord::Base.find method like this
> (works with mysql, though I think it''s standard SQL) :conditions
=>
> ["name LIKE ?", "#{name}%"]. The LIKE will match case
insensitive and
> allows the wildcard character (the percent sign) and the placeholder
> substitution will prevent sql injection attacks.
>
> Second, I think the point of my hack to text_field_with_auto_complete
> was to allow the controller to have one method. So you could have
> just auto_complete_for_person_name where it''s something like this.
>
> def auto_complete_for_person_name
> @people = Person.find(:all,
> :conditions => ["name LIKE ? AND org = ?",
"#{params[:person]
> [:name]}%", params[:person][:org]],
> :order => "name ASC")
> unless @people.blank?
> render :inline => "<%= content_tag(:ul,
> @people.map{|person|
> content_tag(:li, h(person)) }) %>"
> else
> render :inline => ""
> end
> end
>
> Assuming you always pass the [person][org] parameter, which you
don''t
> seem to be doing anymore.
>
> Also, Frederick''s point is very important! (My mistake)
>
> So the final text_field_with_auto_complete_with_id_checking call
> should look like this:
>
> text_field_with_auto_complete_with_id_checking :person, :name, {:id =>
> "badguy"},
> {:with => "''person[name]='' +
encodeURIComponent($(''badguy'').value) +
> ''&person[org]=legion_of_doom''"}
>
> Finally, in your controller you will want to make sure that @people is
> not blank before sending it to map to avoid:
>
> NoMethodError: undefined method `map'' for nil:NilClass
>
> so:
>
> unless @people.blank?
> render ...
> else
> render :inline => ""
> end
>
> If you do need two different controller methods for some other reason
> then you should still take the similar stuff and stick it in a helper
> or private method.
>
> Julian
>
> On Jun 16, 9:02 am, Frederick Cheung
<frederick.che...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
> wrote:
>
> > On 16 Jun 2008, at 13:55, Todd Chambery wrote:
>
> > > After some further tinkering, I''m able to get
''goodguy'' and ''badguy''
> > > values passed to the controller (the ''method per
id'' is far from
> > > ideal....):
>
> > don''t forget to use encodeURIComponent or bad things will
happen if
> > you type & into the box.
>
> > Fred
>
> > > entry.rhtml
>
> > > <p>
> > > <label for="attr_badguy_name">Bad
Guy:</label>
> > > <%> > >
text_field_with_auto_complete_with_id_checking :entity, :name, { :id
> > > => "badguy" }, { :with =>
"''badguy[name]='' + $(''badguy'').value +
> > > ''&entity[schema_type]=complex''"} %>
> > > </p>
> > > <p>
> > > <label for="attr_type_name">Good
Guy:</label>
> > > <%> > >
text_field_with_auto_complete_with_id_checking :goodguy, :name, { :id
> > > => "goodguy" }, { :with =>
"''goodguy[name]='' +
$(''goodguy'').value" }
> > > %>
> > > </p>
--~--~---------~--~----~------------~-------~--~----~
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-/JYPxA39Uh5TLH3MbocFFw@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
-~----------~----~----~----~------~----~------~--~---
julian
2008-Jun-16 16:08 UTC
Re: Two text_field_with_auto_complete field with the same search content
Well, now that you''ve brought up the submit part... yeah, the names
would have to be different too. So let''s just take my
text_field_with_auto_complete hack and crumple it up and throw it in
the trash (or maybe hold on to it for another day).
Let''s go back to using the straight up text_field_with_auto_complete
but move common stuff into the model.
Model:
def self.search_by_name(name, org = nil)
conditions if org
["name LIKE ? AND org = ?",
"#{name}%",
"#{org}"]
else
["name LIKE ?", "#{name}%"]
end
Person.find(:conditions => conditions,
:order => "name ASC")
end
Controller:
def auto_complete_for_goodguy_name
people = Person.search_by_name(
params[:goodguy][:name], "justice_league")
render :partial => ''auto_complete_results'',
:locals => {:people => people}
end
def auto_complete_for_badguy_name
people = Person.search_by_name(
params[:goodguy][:name], "legion_of_doom")
render :partial => ''auto_complete_results'',
:locals => {:people => people}
end
View:
the form:
<!-- good guys --><%= text_field_with_auto_complete :goodguy, :name
%>
<!-- bad guys --><%= text_field_with_auto_complete :badguy, :name %>
And a partial _auto_complete_results.html.erb:
<% unless people.blank? -%>
<%= content_tag(:ul,
people.map{|person| content_tag(:li, h(person))} ) %>
<% end -%>
Or something like that.
On Jun 16, 11:18 am, Todd Chambery
<todd.chamb...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
wrote:> Julian,
>
> Your solution works for providing and filtering the completion
> suggestions. The problem I''m running into is what params get sent
on
> submit:
>
> Parameters: {"commit"=>"Add People",
"person"=>{"name"=>"Superman"},
> "authenticity_token"=>"033d880da069739bd1b80f42e11c6008e
> 54971b9", "action"=>"save_matchup",
"controller"=>"matchup",
> "matchup"=>{"name"=>"foo",
"description"=>"sdafasdf"}}
>
> In this case, "Superman" is the value in the first text field.
The
> generated HTML reveals that both text auto-complete boxes have the
> same name:
>
> <input autocomplete="off" id="goodguy"
name="person[name]" ...
>
> <input autocomplete="off" id="badguy"
name="person[name]" ...
>
> It looks like I need a unique "name" attribute as well as a
unique id
> (if I actually need a unique id at all).
>
> Todd
>
> On Jun 16, 9:49 am, julian
<thefool...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:
>
> > A couple of suggestions:
>
> > First, you''ll be better of using the database to search
through the
> > names for matches as that should be faster then pulling all the names
> > and running them through a regular expression. You can use
> > a :conditions option to the ActiveRecord::Base.find method like this
> > (works with mysql, though I think it''s standard SQL)
:conditions =>
> > ["name LIKE ?", "#{name}%"]. The LIKE will match
case insensitive and
> > allows the wildcard character (the percent sign) and the placeholder
> > substitution will prevent sql injection attacks.
>
> > Second, I think the point of my hack to text_field_with_auto_complete
> > was to allow the controller to have one method. So you could have
> > just auto_complete_for_person_name where it''s something like
this.
>
> > def auto_complete_for_person_name
> > @people = Person.find(:all,
> > :conditions => ["name LIKE ? AND org = ?",
"#{params[:person]
> > [:name]}%", params[:person][:org]],
> > :order => "name ASC")
> > unless @people.blank?
> > render :inline => "<%= content_tag(:ul,
> > @people.map{|person|
> > content_tag(:li, h(person)) }) %>"
> > else
> > render :inline => ""
> > end
> > end
>
> > Assuming you always pass the [person][org] parameter, which you
don''t
> > seem to be doing anymore.
>
> > Also, Frederick''s point is very important! (My mistake)
>
> > So the final text_field_with_auto_complete_with_id_checking call
> > should look like this:
>
> > text_field_with_auto_complete_with_id_checking :person, :name, {:id
=>
> > "badguy"},
> > {:with => "''person[name]='' +
encodeURIComponent($(''badguy'').value) +
> > ''&person[org]=legion_of_doom''"}
>
> > Finally, in your controller you will want to make sure that @people is
> > not blank before sending it to map to avoid:
>
> > NoMethodError: undefined method `map'' for nil:NilClass
>
> > so:
>
> > unless @people.blank?
> > render ...
> > else
> > render :inline => ""
> > end
>
> > If you do need two different controller methods for some other reason
> > then you should still take the similar stuff and stick it in a helper
> > or private method.
>
> > Julian
>
> > On Jun 16, 9:02 am, Frederick Cheung
<frederick.che...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
> > wrote:
>
> > > On 16 Jun 2008, at 13:55, Todd Chambery wrote:
>
> > > > After some further tinkering, I''m able to get
''goodguy'' and ''badguy''
> > > > values passed to the controller (the ''method per
id'' is far from
> > > > ideal....):
>
> > > don''t forget to use encodeURIComponent or bad things
will happen if
> > > you type & into the box.
>
> > > Fred
>
> > > > entry.rhtml
>
> > > > <p>
> > > > <label for="attr_badguy_name">Bad
Guy:</label>
> > > > <%> > > >
text_field_with_auto_complete_with_id_checking :entity, :name, { :id
> > > > => "badguy" }, { :with =>
"''badguy[name]='' + $(''badguy'').value +
> > > > ''&entity[schema_type]=complex''"}
%>
> > > > </p>
> > > > <p>
> > > > <label for="attr_type_name">Good
Guy:</label>
> > > > <%> > > >
text_field_with_auto_complete_with_id_checking :goodguy, :name, { :id
> > > > => "goodguy" }, { :with =>
"''goodguy[name]='' +
$(''goodguy'').value" }
> > > > %>
> > > > </p>
--~--~---------~--~----~------------~-------~--~----~
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-/JYPxA39Uh5TLH3MbocFFw@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
-~----------~----~----~----~------~----~------~--~---
julian
2008-Jun-16 16:11 UTC
Re: Two text_field_with_auto_complete field with the same search content
As you can tell, I haven''t really tested any of this code I''ve been tossing up here... :( the Person.find call in the search_by_name method should be Person.find(:all, :conditions => conditions, :order => "name ASC") On Jun 16, 12:08 pm, julian <thefool...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> Well, now that you''ve brought up the submit part... yeah, the names > would have to be different too. So let''s just take my > text_field_with_auto_complete hack and crumple it up and throw it in > the trash (or maybe hold on to it for another day). > > Let''s go back to using the straight up text_field_with_auto_complete > but move common stuff into the model. > > Model: > > def self.search_by_name(name, org = nil) > conditions > if org > ["name LIKE ? AND org = ?", > "#{name}%", > "#{org}"] > else > ["name LIKE ?", "#{name}%"] > end > Person.find(:conditions => conditions, > :order => "name ASC") > end > > Controller: > > def auto_complete_for_goodguy_name > people = Person.search_by_name( > params[:goodguy][:name], "justice_league") > render :partial => ''auto_complete_results'', > :locals => {:people => people} > end > > def auto_complete_for_badguy_name > people = Person.search_by_name( > params[:goodguy][:name], "legion_of_doom") > render :partial => ''auto_complete_results'', > :locals => {:people => people} > end > > View: > > the form: > > <!-- good guys --><%= text_field_with_auto_complete :goodguy, :name %> > <!-- bad guys --><%= text_field_with_auto_complete :badguy, :name %> > > And a partial _auto_complete_results.html.erb: > > <% unless people.blank? -%> > <%= content_tag(:ul, > people.map{|person| content_tag(:li, h(person))} ) %> > <% end -%> > > Or something like that. > > On Jun 16, 11:18 am, Todd Chambery <todd.chamb...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > > > Julian, > > > Your solution works for providing and filtering the completion > > suggestions. The problem I''m running into is what params get sent on > > submit: > > > Parameters: {"commit"=>"Add People", "person"=>{"name"=>"Superman"}, > > "authenticity_token"=>"033d880da069739bd1b80f42e11c6008e > > 54971b9", "action"=>"save_matchup", "controller"=>"matchup", > > "matchup"=>{"name"=>"foo", "description"=>"sdafasdf"}} > > > In this case, "Superman" is the value in the first text field. The > > generated HTML reveals that both text auto-complete boxes have the > > same name: > > > <input autocomplete="off" id="goodguy" name="person[name]" ... > > > <input autocomplete="off" id="badguy" name="person[name]" ... > > > It looks like I need a unique "name" attribute as well as a unique id > > (if I actually need a unique id at all). > > > Todd > > > On Jun 16, 9:49 am, julian <thefool...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > > > > A couple of suggestions: > > > > First, you''ll be better of using the database to search through the > > > names for matches as that should be faster then pulling all the names > > > and running them through a regular expression. You can use > > > a :conditions option to the ActiveRecord::Base.find method like this > > > (works with mysql, though I think it''s standard SQL) :conditions => > > > ["name LIKE ?", "#{name}%"]. The LIKE will match case insensitive and > > > allows the wildcard character (the percent sign) and the placeholder > > > substitution will prevent sql injection attacks. > > > > Second, I think the point of my hack to text_field_with_auto_complete > > > was to allow the controller to have one method. So you could have > > > just auto_complete_for_person_name where it''s something like this. > > > > def auto_complete_for_person_name > > > @people = Person.find(:all, > > > :conditions => ["name LIKE ? AND org = ?", "#{params[:person] > > > [:name]}%", params[:person][:org]], > > > :order => "name ASC") > > > unless @people.blank? > > > render :inline => "<%= content_tag(:ul, > > > @people.map{|person| > > > content_tag(:li, h(person)) }) %>" > > > else > > > render :inline => "" > > > end > > > end > > > > Assuming you always pass the [person][org] parameter, which you don''t > > > seem to be doing anymore. > > > > Also, Frederick''s point is very important! (My mistake) > > > > So the final text_field_with_auto_complete_with_id_checking call > > > should look like this: > > > > text_field_with_auto_complete_with_id_checking :person, :name, {:id => > > > "badguy"}, > > > {:with => "''person[name]='' + encodeURIComponent($(''badguy'').value) + > > > ''&person[org]=legion_of_doom''"} > > > > Finally, in your controller you will want to make sure that @people is > > > not blank before sending it to map to avoid: > > > > NoMethodError: undefined method `map'' for nil:NilClass > > > > so: > > > > unless @people.blank? > > > render ... > > > else > > > render :inline => "" > > > end > > > > If you do need two different controller methods for some other reason > > > then you should still take the similar stuff and stick it in a helper > > > or private method. > > > > Julian > > > > On Jun 16, 9:02 am, Frederick Cheung <frederick.che...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> > > > wrote: > > > > > On 16 Jun 2008, at 13:55, Todd Chambery wrote: > > > > > > After some further tinkering, I''m able to get ''goodguy'' and ''badguy'' > > > > > values passed to the controller (the ''method per id'' is far from > > > > > ideal....): > > > > > don''t forget to use encodeURIComponent or bad things will happen if > > > > you type & into the box. > > > > > Fred > > > > > > entry.rhtml > > > > > > <p> > > > > > <label for="attr_badguy_name">Bad Guy:</label> > > > > > <%> > > > > text_field_with_auto_complete_with_id_checking :entity, :name, { :id > > > > > => "badguy" }, { :with => "''badguy[name]='' + $(''badguy'').value + > > > > > ''&entity[schema_type]=complex''"} %> > > > > > </p> > > > > > <p> > > > > > <label for="attr_type_name">Good Guy:</label> > > > > > <%> > > > > text_field_with_auto_complete_with_id_checking :goodguy, :name, { :id > > > > > => "goodguy" }, { :with => "''goodguy[name]='' + $(''goodguy'').value" } > > > > > %> > > > > > </p>--~--~---------~--~----~------------~-------~--~----~ 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-/JYPxA39Uh5TLH3MbocFFw@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 -~----------~----~----~----~------~----~------~--~---
Todd Chambery
2008-Jun-16 17:29 UTC
Re: Two text_field_with_auto_complete field with the same search content
I think I may have cracked it.
In the view, I explicitly set the id in the :with clause.
In the person_controller, I get the value of the text field by
grabbing the ''id'' name out of the parameters, and using the
value of
''id'' as key to get the value of the textbox.
In the application_helper, I pass the value of tag_options[:id] to the
text_field generator instead of :object.
Thanks for your help, hopefully this will help the next guy :).
Todd
view:
<%text_field_with_auto_complete_with_id_checking :person, :name, { :id
=> "badguy" }, { :with =>
"''id=badguy&badguy[name]='' +
encodeURIComponent($(''badguy'').value) +
''&person[org]=legionofdoom"} %>
person_controller:
def auto_complete_for_person_name
id = params[:id]
@people = person.find(:all,
:conditions => ["name LIKE ? AND org=?",
"#{params[id][:name]}%", "#{params[person][:org]}%"],
:order => "name ASC")
unless @people.blank?
render :inline => "<%= content_tag(:ul, @people.map{|person|
content_tag(:li, h(person)) }) %>"
else
render :inline => ""
end
end
application_helper:
def text_field_with_auto_complete_with_id_checking(object, method,
tag_options = {},
completion_options = {})
# lets just set the id now and not worry about it throughout
id = tag_options[:id] || "#{object}_#{method}"
(completion_options[:skip_style] ? "" : auto_complete_stylesheet)
+
text_field(id, method, tag_options) +
content_tag("div", "", :id =>
"#{id}_auto_complete", :class =>
"auto_complete") +
auto_complete_field(id,
{ :url => { :action =>
"auto_complete_for_#{object}_#{method}" }
}.update(completion_options))
end
On Jun 16, 12:11 pm, julian
<thefool...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
wrote:> As you can tell, I haven''t really tested any of this code
I''ve been
> tossing up here... :(
>
> the Person.find call in the search_by_name method should be
>
> Person.find(:all, :conditions => conditions,
> :order => "name ASC")
>
> On Jun 16, 12:08 pm, julian
<thefool...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:
>
> > Well, now that you''ve brought up the submit part... yeah, the
names
> > would have to be different too. So let''s just take my
> > text_field_with_auto_complete hack and crumple it up and throw it in
> > the trash (or maybe hold on to it for another day).
>
> > Let''s go back to using the straight up
text_field_with_auto_complete
> > but move common stuff into the model.
>
> > Model:
>
> > def self.search_by_name(name, org = nil)
> > conditions > > if org
> > ["name LIKE ? AND org = ?",
> > "#{name}%",
> > "#{org}"]
> > else
> > ["name LIKE ?", "#{name}%"]
> > end
> > Person.find(:conditions => conditions,
> > :order => "name ASC")
> > end
>
> > Controller:
>
> > def auto_complete_for_goodguy_name
> > people = Person.search_by_name(
> > params[:goodguy][:name], "justice_league")
> > render :partial => ''auto_complete_results'',
> > :locals => {:people => people}
> > end
>
> > def auto_complete_for_badguy_name
> > people = Person.search_by_name(
> > params[:goodguy][:name], "legion_of_doom")
> > render :partial => ''auto_complete_results'',
> > :locals => {:people => people}
> > end
>
> > View:
>
> > the form:
>
> > <!-- good guys --><%= text_field_with_auto_complete :goodguy,
:name %>
> > <!-- bad guys --><%= text_field_with_auto_complete :badguy,
:name %>
>
> > And a partial _auto_complete_results.html.erb:
>
> > <% unless people.blank? -%>
> > <%= content_tag(:ul,
> > people.map{|person| content_tag(:li, h(person))} ) %>
> > <% end -%>
>
> > Or something like that.
>
> > On Jun 16, 11:18 am, Todd Chambery
<todd.chamb...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:
>
> > > Julian,
>
> > > Your solution works for providing and filtering the completion
> > > suggestions. The problem I''m running into is what
params get sent on
> > > submit:
>
> > > Parameters: {"commit"=>"Add People",
"person"=>{"name"=>"Superman"},
> > >
"authenticity_token"=>"033d880da069739bd1b80f42e11c6008e
> > > 54971b9", "action"=>"save_matchup",
"controller"=>"matchup",
> > > "matchup"=>{"name"=>"foo",
"description"=>"sdafasdf"}}
>
> > > In this case, "Superman" is the value in the first text
field. The
> > > generated HTML reveals that both text auto-complete boxes have
the
> > > same name:
>
> > > <input autocomplete="off" id="goodguy"
name="person[name]" ...
>
> > > <input autocomplete="off" id="badguy"
name="person[name]" ...
>
> > > It looks like I need a unique "name" attribute as well
as a unique id
> > > (if I actually need a unique id at all).
>
> > > Todd
>
> > > On Jun 16, 9:49 am, julian
<thefool...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:
>
> > > > A couple of suggestions:
>
> > > > First, you''ll be better of using the database to
search through the
> > > > names for matches as that should be faster then pulling all
the names
> > > > and running them through a regular expression. You can use
> > > > a :conditions option to the ActiveRecord::Base.find method
like this
> > > > (works with mysql, though I think it''s standard
SQL) :conditions =>
> > > > ["name LIKE ?", "#{name}%"]. The LIKE
will match case insensitive and
> > > > allows the wildcard character (the percent sign) and the
placeholder
> > > > substitution will prevent sql injection attacks.
>
> > > > Second, I think the point of my hack to
text_field_with_auto_complete
> > > > was to allow the controller to have one method. So you
could have
> > > > just auto_complete_for_person_name where it''s
something like this.
>
> > > > def auto_complete_for_person_name
> > > > @people = Person.find(:all,
> > > > :conditions => ["name LIKE ? AND org = ?",
"#{params[:person]
> > > > [:name]}%", params[:person][:org]],
> > > > :order => "name ASC")
> > > > unless @people.blank?
> > > > render :inline => "<%= content_tag(:ul,
> > > > @people.map{|person|
> > > > content_tag(:li, h(person)) }) %>"
> > > > else
> > > > render :inline => ""
> > > > end
> > > > end
>
> > > > Assuming you always pass the [person][org] parameter, which
you don''t
> > > > seem to be doing anymore.
>
> > > > Also, Frederick''s point is very important! (My
mistake)
>
> > > > So the final text_field_with_auto_complete_with_id_checking
call
> > > > should look like this:
>
> > > > text_field_with_auto_complete_with_id_checking :person,
:name, {:id =>
> > > > "badguy"},
> > > > {:with => "''person[name]='' +
encodeURIComponent($(''badguy'').value) +
> > > > ''&person[org]=legion_of_doom''"}
>
> > > > Finally, in your controller you will want to make sure that
@people is
> > > > not blank before sending it to map to avoid:
>
> > > > NoMethodError: undefined method `map'' for
nil:NilClass
>
> > > > so:
>
> > > > unless @people.blank?
> > > > render ...
> > > > else
> > > > render :inline => ""
> > > > end
>
> > > > If you do need two different controller methods for some
other reason
> > > > then you should still take the similar stuff and stick it in
a helper
> > > > or private method.
>
> > > > Julian
>
> > > > On Jun 16, 9:02 am, Frederick Cheung
<frederick.che...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
> > > > wrote:
>
> > > > > On 16 Jun 2008, at 13:55, Todd Chambery wrote:
>
> > > > > > After some further tinkering, I''m able to
get ''goodguy'' and ''badguy''
> > > > > > values passed to the controller (the
''method per id'' is far from
> > > > > > ideal....):
>
> > > > > don''t forget to use encodeURIComponent or bad
things will happen if
> > > > > you type & into the box.
>
> > > > > Fred
>
> > > > > > entry.rhtml
>
> > > > > > <p>
> > > > > > <label
for="attr_badguy_name">Bad Guy:</label>
> > > > > > <%> > > > > >
text_field_with_auto_complete_with_id_checking :entity, :name, { :id
> > > > > > => "badguy" }, { :with =>
"''badguy[name]='' + $(''badguy'').value +
> > > > > >
''&entity[schema_type]=complex''"} %>
> > > > > > </p>
> > > > > > <p>
> > > > > > <label
for="attr_type_name">Good Guy:</label>
> > > > > > <%> > > > > >
text_field_with_auto_complete_with_id_checking :goodguy, :name, { :id
> > > > > > => "goodguy" }, { :with =>
"''goodguy[name]='' +
$(''goodguy'').value" }
> > > > > > %>
> > > > > > </p>
--~--~---------~--~----~------------~-------~--~----~
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-/JYPxA39Uh5TLH3MbocFFw@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
-~----------~----~----~----~------~----~------~--~---
Shandy Nantz
2009-Oct-26 18:43 UTC
Re: Two text_field_with_auto_complete field with the same se
julian wrote:> text_field_with_auto_complete(object, method, tag_options = {}, > completion_options = {}) > > Well, you can change the id with the tag_options hash, but the > generated javascript won''t know about it. So, let''s improve > text_field_with_auto_complete so that it does work. > > def text_field_with_auto_complete(object, method, tag_options = {}, > completion_options = {}) > (completion_options[:skip_style] ? "" : auto_complete_stylesheet) + > text_field(object, method, tag_options) + > content_tag("div", "", :id => > "#{object}_#{method}_auto_complete", :class => "auto_complete") + > auto_complete_field("#{object}_#{method}", > { :url => { :action => > "auto_complete_for_#{object}_#{method}" } }.update(completion_options)) > end > > The content_tag and the auto_complete_field methods both set the ids > of elements without consulting what id you passed to the tag_options > hash. We should change those two calls to match whatever :id option > was passed in, if in case it was passed in. > > So... > > def text_field_with_auto_complete_with_id_checking(object, method, > tag_options = {}, completion_options = {}) > # lets just set the id now and not worry about it throughout > id = tag_options[:id] || "#{object}_#{method}" > > (completion_options[:skip_style] ? "" : auto_complete_stylesheet) + > text_field(object, method, tag_options) + > content_tag("div", "", :id => "#{id}_auto_complete", :class => > "auto_complete") + > auto_complete_field(id, > { :url => { :action => > "auto_complete_for_#{object}_#{method}" } }.update(completion_options)) > end > > To get this to work just place it in your application_helper.rb (and > call it with > text_field_with_auto_complete_with_id_checking(:person, :name, {:id => > ''bad_person''}) > > This seems to work for me but it doesn''t have any tests written for it > as I just threw it together... I''ll leave that to someone else. > > JulianHi all, Has anybody done anything with this code? I am trying to use it and I am not sure if it works. I have made a few changes but seem to be crawling deeper and deeper into a bottomless hole. My issue is that I have several divs with the same auto_completer for each and all within different forms and all located on the same page. The issue became that when I used the auto_completer on a div located lower on the page it appeared not to work, when in fact it did work, it was just populating the list higher up on the page (because the id fields were named the same), which is why I needed to re-name each auto_completer with a unique name. My code looks like: View ----- <div id = "clone_to_div"> Clone to Pseudocity: <%= text_field_with_auto_complete_with_id_checking :enpseudo, :pseudocity, {:id => ''enpseudo_service_fees''}, {:skip_style => true} %> </div> <%= link_to_remote( ''<span>Clone</span>'', {:submit => ''clone_to_div'', :update => ''clone_fee_div'', :complete => ''new Effect.Pulsate(\''clone_fee_div\'');'', :url => {:action => ''clone_pseudo_fee'', :pseudo_id => @pseudo.id} }, :class => ''squarebutton'') %> The issue that I am having is that when the form is submitted nothing from the auto_complete is submitted. One issue that I have noticed from the HTML generated code is that the <input ... /> has the correct id but an incorrect name. So, I did as suggested and gave it a name via the tag_options and that''s when things started to go south. By supplying a name the auto_complete_field seems to stop working all together. Remove it and it works but nothing gets passed along in my post - this seems to be a catch-22. Any suggestions on what I am doing wrong or can someone point me in the right direction? Thanks for any and all help, -S -- Posted via http://www.ruby-forum.com/.
Shandy Nantz
2009-Oct-26 20:42 UTC
Re: Two text_field_with_auto_complete field with the same se
Shandy Nantz wrote:> View > ----- > <div id = "clone_to_div"> > Clone to Pseudocity: <%= > text_field_with_auto_complete_with_id_checking > :enpseudo, :pseudocity, {:id => ''enpseudo_service_fees''}, > {:skip_style => true} %> > </div> > > <%= link_to_remote( ''<span>Clone</span>'', > {:submit => ''clone_to_div'', :update => ''clone_fee_div'', > :complete => ''new Effect.Pulsate(\''clone_fee_div\'');'', > :url => {:action => ''clone_pseudo_fee'', :pseudo_id => @pseudo.id} > }, :class => ''squarebutton'') %> >Never mind, my fault. I had multiple "clone_to_div" that was causing the issue. Once I remained these div to have unique id''s all issues went away. -S -- Posted via http://www.ruby-forum.com/.