Hi David,

The reason I need to redefine the assignment and make it private is
that because whenever x is assigned a new value, some other processes
must take place:

def set_x(val)
    self.x = val
    # some other processes take place here
end

private

def x=(val)
    super
end

I don't understand when you say that there is no built-in method for
"x=".  How else can one assign value to an attribute?

Thanks.

On Jul 19, 8:03 pm, "David A. Black" <[email protected]> wrote:
> Hi --
>
>
>
> On Sun, 19 Jul 2009, Learn By Doing wrote:
>
> > On Jul 19, 6:39 pm, "David A. Black" <[email protected]> wrote:
> >> Hi --
>
> >> On Sun, 19 Jul 2009, Ease Bus wrote:
> >>> Hi,
>
> >>> I would like to rename the setter of "attribute_A" with the following:
>
> >>> def set_attribute_A(val)
> >>>     self.attribute_A = val
> >>> end
>
> >>> private
>
> >>> def attribute_A=(val)
> >>>     super
> >>> end
>
> >>> But then I get "NoMethodError: Attempt to call private method"  I thought 
> >>> that a private method is
> >>> accessible from within the same instance.
>
> >> There's not quite enough information in the code you've got here to
> >> see what's going on. Do you have a superclass with a definition for
> >> the attribute_A= method? (I'm trying to figure out why you're calling
> >> super.)
>
> > Hi David,
>
> > Thanks for your response.  attribute_A is just an attribute in a model
> > that is a subclass of ActiveRecord::Base.  attribute_A is of type
> > integer.
>
> > The reason I used "super" is because I just wanted to assign the value
> > of "val" to attribute_A in the private setter method "attribute_A="  I
> > can't say self.attribute_A = val because that is calling the private
> > method I am defining.
>
> I'm trying to duplicate the error message you're getting, but I can't
> quite get my example code to do that. On the other hand, I believe
> there are other issues.... If you define, say, x= to call super, the
> problem is that you'll hit method_missing (because there's no built-in
> x= method). And method_missing will obligingly define x= for you, and
> not make it private. That's just a result of how AR implements
> method_missing; it does some on-the-spot definition of attribute
> methods.
>
> I suspect you're going to have trouble with this whole thing, because
> you're going up against AR's internals. I may well be overlooking
> something, but that's my (late at night :-) impression. I can't help
> wondering whether you absolutely need to do this. The whole "set_x"
> naming scheme is very unidiomatic in Ruby, and the convention of the =
> methods acting like assignments, in their return semantics, is
> generally not considered a problem.
>
> Is there something in that original goal that you could reassess?
>
> David
>
> --
> David A. Black / Ruby Power and Light, LLC
> Ruby/Rails consulting & training:http://www.rubypal.com
> Now available: The Well-Grounded Rubyist (http://manning.com/black2)
> Training! Intro to Ruby, with Black & Kastner, September 14-17
> (More info:http://rubyurl.com/vmzN)
--~--~---------~--~----~------------~-------~--~----~
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 [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to