2016-05-10 5 views
1

私は、このモデルを持っている:フェニックスのモデルにインスタンスメソッドを追加するには?

defmodule MyApp.MyModel do 
    use MyApp.Web, :model 
    import Ecto.Query 

    # .... 

どのようにしても、mymodelという上の他のフィールドを使用することにインスタンスメソッドを追加することができますか?これは、エリクサーは関数型プログラミング言語であるので、あなたはメソッドを持っていない、あなたが機能を持っているthe key :my_method not found

defmodule MyApp.MyModel do 
    use MyApp.Web, :model 
    import Ecto.Query 

    # doesn't work 
    def my_method do 
    # how can I get access to "this" or "self" from here? 

    "test" 
    end 

答えて

11

を言って例外がスローされますので、htmlページでは動作しません。また、「インスタンス」という概念もありません。 self関数がありますが、これは現在のプロセスのPIDを識別するために使用されますが、他のプログラミング言語で使用されている "this"と混同しないでください。

機能は、常にで呼び出されます(私はmy_funcの名前を変更した)あなたの例ではmy_method関数を呼び出すので

module.function(arg1, arg2) 

、あなたはどうなる:

def my_func(my_model) do 
    my_model.some_attribute 
end 

ここで注目すべき事を関数への引数として構造体を渡す必要があるということです。あなたは、その後でこれを呼び出します。

foo = %MyModel{} 
MyModel.my_func(foo) 

http://elixir-lang.org/getting-started/introduction.htmlはElixirの作業では一方向関数について学ぶための素晴らしい方法です。

+0

実際には、データベースから取得したオブジェクトのフィールドにアクセスできるのと同じ方法でアクセスできます。したがって、HTMLページでは、私は '<%= my_item.title%>'と書くことができます。しかし、あなたのアプローチを使って、私は "my_func"に対して同じことをすることはできません。どのように '<%= my_item.my_func%>'を書くことができるように変更する必要がありますか? – Ommonnna

+1

テンプレートから関数を呼び出すには、<%= MyModel.my_func(my_item)%> ' – Gazler

+0

yesですが、' <%= my_item.my_func()%> 'または' <% = my_item.my_func%> ' – Ommonnna

関連する問題