は、これは実際にそう基本的に、これはこれはself.My
後のすべてがコメントになることを意味し、単一の行であるという事実
def MyColumn; self.My#Column; end
def MyColumn?; self.My#Column?; end
def MyColumn=(val); self.My#Column= val; end
お知らせになってきている
Source
module_eval <<-STR, __FILE__, __LINE__ + 1
def #{new_name}; self.#{old_name}; end # def subject; self.title; end
def #{new_name}?; self.#{old_name}?; end # def subject?; self.title?; end
def #{new_name}=(v); self.#{old_name} = v; end # def subject=(v); self.title = v; end
STR
をやっていること
alias_attribute
です(
end
を含む)、したがって受信しているエラーです。
rails
ruby
の1行ではない場合でも、
My
は、
#Column
の部分がコメントとして扱われるため、
My
はメソッドではないという事実のために、単に
NoMethodError
を送出します。
ActiveModel#alias_attribute
はここ
def define_proxy_call(include_private, mod, name, send, *extra)
defn = if NAME_COMPILABLE_REGEXP.match?(name)
"def #{name}(*args)"
else
"define_method(:'#{name}') do |*args|"
end
extra = (extra.map!(&:inspect) << "*args").join(", ".freeze)
target = if CALL_COMPILABLE_REGEXP.match?(send)
"#{"self." unless include_private}#{send}(#{extra})"
else
"send(:'#{send}', #{extra})"
end
mod.module_eval <<-RUBY, __FILE__, __LINE__ + 1
#{defn}
#{target}
end
RUBY
end
のように見えますdefine_proxy_call
を経由して、まったく同じの機能の実装を持っているあなたはそれが実際に見て確認し見ることができるので、これはまた奇妙なようであれば、新しい名前(name
)と元の名前( send
)は「順守可能」であり、そうでなければ適切に処理します。
alias_attribute
ではなく、本質的にコメント文字である問題が発生します。 public_send
を使用して手動で実装することをおすすめします。
def MyColumn
self.public_send("My#Column")
end
def MyColumn=(val)
self.public_send("My#Column=",val)
end
def MyColumn?
self.public_send("My#Column?")
end
これは同じですが、構文上の問題はありません。
これを説明する時間をとっていただきありがとうございます。私は何かを学んだ。そしてそれは働いた。乾杯! – JosephGage