afeld / jeditable-rails

a gem to add in-place-editable fields to your Rails project
MIT License
34 stars 18 forks source link

updating field on submit #9

Closed marccantwell closed 13 years ago

marccantwell commented 13 years ago

I have plugin working properly (data is being submitted), but my dom elements aren't updating dynamically upon submit. Am I missing an option for the field to update?

afeld commented 13 years ago

Can you give a bit more context? If you can paste your view and controller code I can probably be more helpful. Also, is the request returning with a status of 200 (you can check this in your Rails log, and/or with the Firebug Net tab (or equivalent)).

marccantwell commented 13 years ago

Code is for a polymorphic address object. On submit works, the data is submitted to the database and upon browser refresh the updated information is displayed. However, it doesn't refresh/update the divs that have been updated upon submit. No status 200.

----View---- <%= div_for address do %> Address:

<%= editable_field address, :street, :cancel => 'Cancel', :submit => 'Submit', :indicator => '" 'Click to edit...' %>

<%= editable_field address, :city, :onblur => 'submit' %>

<%= editable_field address, :state %>

<%= editable_field address, :zip %>

<%= editable_field address, :type %>
``` <%= link_to 'Delete',address, :method => :delete, :class => "delete", :remote => true %> ``` <% end %> ---Controller--- class AddressesController < ApplicationController def create @address = Address.new(params[:address]) ``` if @address.save flash[:notice] = "Thanks for your address!" else flash[:alert] = "Your addresses might have some errors, please check and try again." end respond_to do |format| format.html { redirect_to @address.addressable } format.js end ``` end # PUT /notes/1 # PUT /notes/1.xml def update @address = Address.find(params[:id]) ``` if @address.update_attributes(params[:address]) flash[:notice] = "Address Updated!" else flash[:alert] = "Your addresses might have some errors, please check and try again." end respond_to do |format| format.html format.js end ``` end def destroy @address = Address.find(params[:id]) @address.destroy ``` respond_to do |format| format.html { redirect_to @address.addressable } format.js end ``` end end
afeld commented 13 years ago

So I think the problem is that the new value is not being returned from the update action in your controller - jeditable uses the response body as the new value for the field. I clearly failed to document this. This is a snippet of my respond_to block for the Resource model (see the full controller here):

format.html {
  if request.xhr?
    render :text => params[:resource].values.first
  else
    redirect_to(@resource, :notice => 'Resource was successfully updated.')
  end
}

Now realizing it really needs a helper method or something provided by the gem to make it cleaner... I'm open to suggestions about how to do this, but will take a stab at it in the next few days and try to get it out asap. Thanks for putting this through it's paces!

marccantwell commented 13 years ago

Thank yo uso much for all your work on this. I think it is a great gem. I'll think on the helper method as I continue to work with it. Thanks again for your quick response.

troya2 commented 13 years ago

I added the following helper method to application_controller.rb

def respond_to_jeditable resource
  if request.xhr?
    render :text => params[resource].values.first
    true
  else
    false
  end
end

And use it in my controllers this way:


def update
  @job.update_attributes(params[:job])

  respond_to_jeditable(:job) || respond_with(@job)
end