Hi -- On Mon, 20 Jul 2009, Learn By Doing wrote:
> 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? > > 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? Meaning, there's no x= method in ActiveRecord::Base. It only comes into being because there's a column of that name in your database. Another possibility that occurs to me is: def x=(val) super # other stuff here end There's something that I can't quite put my finger on that bugs me about that, though... not sure what it is, and maybe it's fine. (Maybe it's the fact that it relies on the underlying implementation of method_missing.) But that takes us back to the original question about returning an arbitrary value from a = method. That's the thing I'm wondering whether you really need to do. 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 -~----------~----~----~----~------~----~------~--~---

