Forum: Ruby on Rails NewbieQ : undefined method `stringify_keys!' Dumb Question

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
17d01ff4326c26911481c7a77283b343?d=identicon&s=25 Eric Sloane (Guest)
on 2005-12-22 23:45
(Received via mailing list)
Hi,
I'm running round in circles again! I'm trying to save a note that has a
HABTM relationship with a job. The note is new - the job exists.
In my partial for notes I have ;

<%= start_form_tag :action => 'new_note', :id => @job %>


	  <%= text_area_tag "note", nil, :size => "65x10" %>

	  <%=submit_tag 'Add Note', :note => @job.note %>

<%= end_form_tag %>
Which exists on a page containing another partial with job data.

In the controller there is ;

   def dashboard_job_update
     @job = Job.find(params[:id])
	@note = Note.new(params[:note])   <---this is line 99
	@job.notes << @note
     if @job.update_attributes(params[:job]).......

The submitted params are;

Request

Parameters: {"commit"=>"Add Note", "id"=>"1",
"job"=>{"job_state_id"=>"2", "current_action_id"=>"7",
"job_phase_id"=>"2", "job_wait_state_id"=>"4"},
"note"=>"xzczcxvzxcvzxc"}

The error message is;
undefined method `stringify_keys!' for "xzczcxvzxcvzxc":String

And the trace is ;
d:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.13.2/lib/active_record/base.rb:1333:in
`attributes='
d:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.13.2/lib/active_record/base.rb:1188:in
`initialize_without_callbacks'
d:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.13.2/lib/active_record/callbacks.rb:236:in
`initialize'
#{RAILS_ROOT}/app/controllers/job_controller.rb:99:in `new'
#{RAILS_ROOT}/app/controllers/job_controller.rb:99:in
`dashboard_job_update'

See above for line 99

Can't find much to explain this error - can anyone help?

Kind Regards,
Eric.
137039860fa6b38713e1349da8a4137d?d=identicon&s=25 Marc Love (Guest)
on 2005-12-23 02:24
I'm a little confused by how you're approaching the addition of the
note.

First of all, in your partial, you have:

<%= start_form_tag :action => 'new_note', :id => @job %>

But the action you're showing us in the controller is
"dashboard_job_update" not "new_note".  Your action in your
start_form_tag directly correlates to what method is executed on form
submission.

Also, and this is the cause of your stringify_keys! error, :note is not
a valid option for the submit tag.  Its submit_tag(value, options).
value is whatever you want the Submit button to say and options are
html-type options, such as :class or :id.

Here's what I would do instead.  In whatever controller that corresponds
to the view you've given us below define @job (@job =
Job.find(params[:id])) and define a new note object (@note = Note.new).
Then use the following for your view:

<%= start_form_tag :action => 'dashboard_job_update' %>
  <%= text_area_tag "note", nil, :size => "65x10" %>
  <%= hidden_field_tag "job_ids[]", job.id %>
  <%= submit_tag "Add Note" %>
<%= end_form_tag %>

Then I'd change your controller as follows:

def dashboard_job_update
  @note = Note.new(params[:note])
  @note.jobs = Job.find(@params[:job_ids]) if @params[:job_ids]
  if @note.save ......

You might want to change your method name too because you're not really
updating a job, you're creating a note.  Also, are you sure it is a
HABTM relationship you want?  If you're only adding each note to one
job, then note really only needs a belongs_to relationship with job
(which would require different code than above of course).

Eric Sloane wrote:
> Hi,
> I'm running round in circles again! I'm trying to save a note that has a
> HABTM relationship with a job. The note is new - the job exists.
> In my partial for notes I have ;
>
> <%= start_form_tag :action => 'new_note', :id => @job %>
>
>
> 	  <%= text_area_tag "note", nil, :size => "65x10" %>
>
> 	  <%=submit_tag 'Add Note', :note => @job.note %>
>
> <%= end_form_tag %>
> Which exists on a page containing another partial with job data.
>
> In the controller there is ;
>
>    def dashboard_job_update
>      @job = Job.find(params[:id])
> 	@note = Note.new(params[:note])   <---this is line 99
> 	@job.notes << @note
>      if @job.update_attributes(params[:job]).......
>
> The submitted params are;
>
> Request
>
> Parameters: {"commit"=>"Add Note", "id"=>"1",
> "job"=>{"job_state_id"=>"2", "current_action_id"=>"7",
> "job_phase_id"=>"2", "job_wait_state_id"=>"4"},
> "note"=>"xzczcxvzxcvzxc"}
>
> The error message is;
> undefined method `stringify_keys!' for "xzczcxvzxcvzxc":String
>
> And the trace is ;
> d:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.13.2/lib/active_record/base.rb:1333:in
> `attributes='
> d:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.13.2/lib/active_record/base.rb:1188:in
> `initialize_without_callbacks'
> d:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.13.2/lib/active_record/callbacks.rb:236:in
> `initialize'
> #{RAILS_ROOT}/app/controllers/job_controller.rb:99:in `new'
> #{RAILS_ROOT}/app/controllers/job_controller.rb:99:in
> `dashboard_job_update'
>
> See above for line 99
>
> Can't find much to explain this error - can anyone help?
>
> Kind Regards,
> Eric.
967f758fa9de78e7fe8425469f7a7acc?d=identicon&s=25 David Barrett (Guest)
on 2005-12-23 20:57
(Received via mailing list)
If I remember correctly, if you use Note.new with params[:note], then
:note should be a hash containing the paramaters for Note. What Rails
is trying to do is read the hash in :note, but it's not a hash, it's a
string.

Assuming you're trying to set Note.value, try this instead:

@note = Note.new(:value => params[:note])

changing value to whatever attribute "xzczcxvzxcvzxc" was bound for.

Have a look at the documentation for ActiveRecord:
http://api.rubyonrails.com/classes/ActiveRecord/Base.html

Dave

On 12/22/05, Eric Sloane <esloane@exemail.com.au> wrote:
>           <%=submit_tag 'Add Note', :note => @job.note %>
>      if @job.update_attributes(params[:job]).......
> undefined method `stringify_keys!' for "xzczcxvzxcvzxc":String
>
> http://lists.rubyonrails.org/mailman/listinfo/rails
>


--
Site: http://antidis.com/
17d01ff4326c26911481c7a77283b343?d=identicon&s=25 Eric Sloane (Guest)
on 2005-12-24 00:46
(Received via mailing list)
Thanks David, Marc, Ed for the responses. All have been really helpful.
My problem is turning out to be fairly fundamental insofar as I'm trying
to run a set of partials, each with it's own form which, I'm beginning
to realise, is probably not a great idea. Ultimately what I'm trying to
acheive is my main job data - customer, address, job status, etc.. on a
main page with stuff like contacts, notes, etc.. on their own forms in a
tabbed section of the main page.
Eric.
This topic is locked and can not be replied to.