Forum: Ruby on Rails super() 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.
Pierre-Alexandre M. (Guest)
on 2007-03-15 13:55
(Received via mailing list)
Hi folks,

I am trying to hack in_place_edit_for to avoid empty fields:

  def in_place_edit_for(object, attribute, options = {})
    if params[:value] == ''
      params[:value] = 'Hey! You must fill the field!'
    end
    super(object,attribute,options)
  end


It doesn't work, the params[:value] is not affected.

But I've done the same thing with the in_place_editor helper to
globalize options[] parameters and it works...

(ok, I could past the 3 lines of define_method...)

--
,========================.
| Pierre-Alexandre M. |
| email : removed_email_address@domain.invalid |
`========================'
Russell N. (Guest)
on 2007-03-15 16:24
(Received via mailing list)
Are you sure params[:value] is actually an empty string? I'd shorten
that to

params[:value] = "Hey! You must fill the field!" if
params[:value].blank?

or, to avoid a string of spaces [correctly] validating as !blank?,

params[:value] = "Hey! You must fill the field!" if
params[:value].strip.blank?

RSL
Pierre-Alexandre M. (Guest)
on 2007-03-15 16:29
(Received via mailing list)
On Thu, Mar 15, 2007 at 10:17:19AM -0400, Russell N. wrote :
> Are you sure params[:value] is actually an empty string?

params hash is:
 {"action"=>"set_user_mail", "id"=>"3", "value"=>"",
"controller"=>"my_bug_app"}

> I'd shorten that to
>
> params[:value] = "Hey! You must fill the field!" if params[:value].blank?
>
> or, to avoid a string of spaces [correctly] validating as !blank?,
>
> params[:value] = "Hey! You must fill the field!" if
> params[:value].strip.blank?

You're right, it's cleaner :) Anyway, it doesn't work either :'(

--
,========================.
| Pierre-Alexandre M. |
| email : removed_email_address@domain.invalid |
`========================'
Russell N. (Guest)
on 2007-03-15 16:31
(Received via mailing list)
Well, it was worth a try. :) I've never used in_place_editor so I really
don't know much about it. I was going to look at the API but its [gasp!]
down. [again.]

RSL
Eden L. (Guest)
on 2007-03-16 05:08
(Received via mailing list)
The reason it's not work is because in_place_edit_for defines an
instance method which will access params at run-time.  Not define
time.  So the statement you put before super will have no effect.

23:         def in_place_edit_for(object, attribute, options = {})
24:           define_method("set_#{object}_#{attribute}") do
25:             @item =
object.to_s.camelize.constantize.find(params[:id])
26:             @item.update_attribute(attribute, params[:value])
27:             render :text => @item.send(attribute)
28:           end
29:         end

You should monkey patch this method or you can simply define the
action it would have defined yourself.

For some reason it has an options parameter but never uses it... so
your patch could be flexible.

e.g.

in_place_edit_for(:post, :comment, :check_blanks => true, :blank_error
=> 'What do you want to say?')

---

module ActionController
  module Macros
    module InPlaceEditing
      module ClassMethods
        def in_place_edit_for(object, attribute, options = {})
          define_method("set_#{object}_#{attribute}") do
            @item = object.to_s.camelize.constantize.find(params[:id])
            if params[:value].blank? && options[:check_blanks]
              render :text => options[:blank_error] || "Fill in this
field."
            else
              @item.update_attribute(attribute, params[:value])
              render :text => @item.send(attribute)
            end
          end
        end
      end
    end
  end
end
Pierre-Alexandre M. (Guest)
on 2007-03-16 10:03
(Received via mailing list)
On Fri, Mar 16, 2007 at 03:05:52AM -0000, eden li wrote :
> The reason it's not work is because in_place_edit_for defines an
> instance method which will access params at run-time.  Not define
> time.  So the statement you put before super will have no effect.

Gasp! You're right. I'm so stupid.

>             if params[:value].blank? && options[:check_blanks]
>   end
> end

Nice solution :)

Thanks.

--
,========================.
| Pierre-Alexandre M. |
| email : removed_email_address@domain.invalid |
`========================'
This topic is locked and can not be replied to.