干掉视图功能

时间:2016-04-30 15:55:52

标签: elixir phoenix-framework

我在三个不同的视图(full_nameuser_view.exgroup_view.ex)中具有相同的功能connection_view.ex。我怎么能重构它是干的?我希望full_name函数只在项目的一个位置。

defmodule MyApp.GroupView do
  use MyApp.Web, :view
  alias MyApp.User

  def full_name(%User{first_name: first_name,
                      last_name: last_name,
                      honorific_prefix: honorific_prefix,
                      honorific_suffix: honorific_suffix}) do
    [honorific_prefix, first_name, last_name, honorific_suffix]
    |> Enum.reject(&(&1 == ""))
    |> Enum.join(" ")
  end  
end

2 个答案:

答案 0 :(得分:1)

有几种方法可以解决它。最简单的方法是将该函数放在一个单独的模块中,然后将其导入到您需要的任何地方,但我想这将是一个混乱,所以您应该首先设计您的应用程序并提出一个适当的方法来解决它。您不应该害怕在应用程序中创建自己的文件夹和结构元素。

正如我在另一个答案中提到的,你可以创建一个单独的结构元素,比如装饰器(不确定名称是否合适),那么它就是这样的:

defmodule MyApp.UserDecorator do

  def full_name(%MyApp.User{first_name: first_name, last_name: last_name} = user) do
    first_name <> " " <> last_name
  end

end

然后,您可以在应用中的任何位置使用它。

答案 1 :(得分:1)

由于模板只是函数,您可以在某个帮助程序模块中定义常用函数,并将其导入到您需要的每个View

defmodule MyApp.UserHelpers do
  def full_name(...)
    # ...
  end
end

defmodule MyApp.UserView do
  use MyApp.Web, :view
  import MyApp.UserHelpers

  # ...
end