2017-12-21 5 views
0

私はエイリアスしようとしているMy#Columnという名前の列を持つレガシーデータベースを持っています。私の続編モデルでは私が持っている:ハッシュタグ付き列のエイリアスを列に表示

alias_attribute :MyColumn, :"My#Column" 

しかし、私は構文エラーを取得:

...Ruby24-x64/lib/ruby/gems/2.4.0/gems/activesupport-5.1.4/lib/active_support/core_ext/module/aliasing.rb:26: syntax error, unexpected end-of-input, expecting keyword_end

問題が#のようです。 \#のようにエスケープしようとしましたが、同じエラーが発生します。私はこの種の記号が他の場所で私のために働いていたので、なぜ構文エラーが出るのかわかりません。

このエイリアスを機能させるにはどうすればよいですか?

答えて

1

は、これは実際にそう基本的に、これはこれは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 

これは同じですが、構文上の問題はありません。

+0

これを説明する時間をとっていただきありがとうございます。私は何かを学んだ。そしてそれは働いた。乾杯! – JosephGage

関連する問題