无法在Elixir中的rumbl教程项目中使用生成器

时间:2019-09-05 12:21:41

标签: elixir phoenix-framework phoenix elixir-framework

我一直在关注Programming Phoenix这本书。我从第六章“生成器和关系”开始,由于以下原因,我无法阅读本书

书中说要运行此命令

    mix phoenix.gen.html Video videos user_id:references:users \
url:string title:string description:text

我在运行此命令时遇到问题,但是将其更改为

mix phoenix.gen.html Video Videos user_id :references: users url:string title:string description:text

有效(针对该步骤)

但是,除了在web / controllers,web / templates和web / views目录中创建所需的文件之外,它在lib目录中创建所有内容(如下面的屏幕快照1所示)

enter image description here 屏幕截图1

然后,当我在遵循第95页的书后运行mix ecto.migrate命令时,在/lib/rumbl_web/controllers/video_controller.ex第22行中出现了videos_path / 3函数未定义的错误,如屏幕快照2所示

enter image description here 屏幕截图2

第22行是这样

 redirect(to: videos_path(conn, :show, videos))

在video_controller.ex内部

,完整文件如下:

    defmodule RumblWeb.VideosController do
  use Rumbl.Web, :controller

  alias Rumbl.Video
  alias Rumbl.Video.Videos

  def index(conn, _params) do
    user_id = Video.list_user_id()
    render(conn, "index.html", user_id: user_id)
  end

  def new(conn, _params) do
    changeset = Video.change_videos(%Videos{})
    render(conn, "new.html", changeset: changeset)
  end

  def create(conn, %{"videos" => videos_params}) do
    case Video.create_videos(videos_params) do
      {:ok, videos} ->
        conn
        |> put_flash(:info, "Videos created successfully.")
        |> redirect(to: videos_path(conn, :show, videos))
      {:error, %Ecto.Changeset{} = changeset} ->
        render(conn, "new.html", changeset: changeset)
    end
  end

  def show(conn, %{"id" => id}) do
    videos = Video.get_videos!(id)
    render(conn, "show.html", videos: videos)
  end

  def edit(conn, %{"id" => id}) do
    videos = Video.get_videos!(id)
    changeset = Video.change_videos(videos)
    render(conn, "edit.html", videos: videos, changeset: changeset)
  end

  def update(conn, %{"id" => id, "videos" => videos_params}) do
    videos = Video.get_videos!(id)

    case Video.update_videos(videos, videos_params) do
      {:ok, videos} ->
        conn
        |> put_flash(:info, "Videos updated successfully.")
        |> redirect(to: videos_path(conn, :show, videos))
      {:error, %Ecto.Changeset{} = changeset} ->
        render(conn, "edit.html", videos: videos, changeset: changeset)
    end
  end

  def delete(conn, %{"id" => id}) do
    videos = Video.get_videos!(id)
    {:ok, _videos} = Video.delete_videos(videos)

    conn
    |> put_flash(:info, "Videos deleted successfully.")
    |> redirect(to: videos_path(conn, :index))
  end
end

我无法获得它,因为我是凤凰和长寿药的新手。     有人可以帮我解决我哪里出了问题以及如何解决该问题。

1 个答案:

答案 0 :(得分:2)

您的问题是使用不同版本Phoenix上的函数。这来自阅读Programming Phoenix的旧版本书(现在最新版本为1.4,该版本针对Phoenix 1.4进行了更新)。您应该阅读最新的书以学习最新的Phoenix。

release notes 1.3

  

1.3.0使用phx。所有生成器上的前缀。尽管旧的发电机仍在附近,但给社区和学习资源提供了赶上的时间。 ?它们将在1.4.0上删除

这是原因:

根据屏幕快照1中的项目结构,您可以使用来启动项目

mix phx.new rumbl

但是在那之后,旧功能的书指南

mix phoenix.gen.html

这会导致所有问题。

第一个问题:\表示代码在同一行

mix phoenix.gen.html Video videos user_id:references:users \
url:string title:string description:text