Показать только опубликованные сообщения в представлении индекса сообщений

У меня есть модель/представление/контроллер/шаблоны Post в моем приложении Phoenix со следующей схемой:

  schema "posts" do
    field :title, :string
    field :content, :string
    field :published, :boolean
    belongs_to :user, MyApp.User

    timestamps
  end

В настоящее время в web/controllers/post_controller.ex у меня есть это:

def index(conn, _params, user) do
  projects = Repo.all(MyApp.Project)
  render(conn, "index.html", projects: projects)
end

В моем файле templates/post/index.html.eex перечислены все сообщения; однако то, что я хотел бы сделать, это показывать только опубликованные сообщения (сообщения, где опубликовано, равно true).

Я знаю, что мне нужно изменить эту строку в действии index, но я не уверен, на что ее изменить. Как лучше всего это сделать в Phoenix/Elixir?

Как лучше всего это сделать?


person Andrew Hendrie    schedule 07.04.2016    source источник


Ответы (1)


Это можно сделать, изменив web/controllers/post_controller.ex следующим образом:

  def index(conn, _params, user) do
    projects = Repo.all(from u in Project, where: u.approved == true)
    render(conn, "index.html", projects: projects)
  end

Я не уверен, является ли это правильным/лучшим способом достижения результата; однако это работает. Пожалуйста, прокомментируйте и дайте мне знать или опубликуйте другой ответ, если есть лучший способ.

person Andrew Hendrie    schedule 07.04.2016
comment
Это почти все для вашего случая. Я не помню лучшего способа. Но у меня есть несколько предложений: - Хорошая практика - использовать псевдонимы моделей, которые вы будете часто использовать в контроллере. - В качестве упражнения попробуйте создать фильтр (если true показывать только опубликованные, если false показывать все) для вашего индексного действия. - person Sasha Fonseca; 07.04.2016
comment
Да, фильтр был бы великолепен. Вы могли бы сократить его до Repo.all(Project.approved) - person NoDisplayName; 08.04.2016
comment
может кто-нибудь из вас привести пример? примет в качестве ответа, если вы это сделаете. спасибо :) - person Andrew Hendrie; 08.04.2016