我在三个不同的视图(full_name
,user_view.ex
和group_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
答案 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