Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir slug包含一个nil值_Elixir_Phoenix Framework - Fatal编程技术网

Elixir slug包含一个nil值

Elixir slug包含一个nil值,elixir,phoenix-framework,Elixir,Phoenix Framework,我在《长生不老药》一页上看到了。我在创建新记录方面有问题。当我试图添加一本新书时,我会遇到这样一个错误 cannot convert Bookstore.Inventory.Book to param, key :slug contains a nil value 我不知道我的代码哪里出了问题。我已经编写了相同的代码来为我的作者的页面创建slug,而且效果很好。如果能指出我犯了错误,我将不胜感激。 我正在使用{:slagify,~>1.3} inventory/book.ex @d

我在《长生不老药》一页上看到了。我在创建新记录方面有问题。当我试图添加一本新书时,我会遇到这样一个错误

cannot convert Bookstore.Inventory.Book to param, key :slug contains a nil value
我不知道我的代码哪里出了问题。我已经编写了相同的代码来为我的作者的页面创建slug,而且效果很好。如果能指出我犯了错误,我将不胜感激。 我正在使用
{:slagify,~>1.3}

inventory/book.ex

      @derive {Phoenix.Param, key: :slug}
  schema "books" do
    field(:description, :string)
    field(:image_url, BookstoreWeb.Uploaders.ImageUploader.Type)
    field(:isbn, :string)
    field(:original_price, :float)
    field(:title, :string)
    field(:slug, :string)
    field(:year_published, :integer)

    belongs_to(:category, Bookstore.Genres.Category)
    belongs_to(:author, Bookstore.Writers.Author)

    timestamps()
  end

  @doc false
  def changeset(book, attrs) do
    book
    |> cast(attrs, [
      :author_id,
      :category_id,
      :isbn,
      :title,
      :description,
      :year_published,
      :original_price,
      :slug
    ])
    |> validate_required([:isbn, :title, :description, :year_published, :original_price])
    |> build_slug()
    |> cast_attachments(attrs, [:image_url])
  end

  def build_slug(changeset) do
    id = get_field(changeset, :id)
    title = get_field(changeset, :title)

    if id && title do
      name = Enum.join([id, title], "")
      slug = Slug.slugify(name)
      put_change(changeset, :slug, slug)
    else
      changeset
    end
  end
存货清单

  def get_book!(slug),
    do:
      Repo.get_by!(Book, slug: slug)
      |> Repo.preload(:category)
      |> Repo.preload(:author)

  def create_book(attrs \\ %{}) do
    %Book{}
    |> Book.changeset(attrs)
    |> Repo.insert()
  end

默认情况下,Ecto允许数据库自动生成主键(请参阅),这意味着只有在将书籍保存到数据库后(在调用
Repo
之后),才会生成
id
,并且在此之前无法检索。 您的
get\u字段(changeset,:id)
build\u slug
中的调用将返回
nil
,您的
else
分支将被评估,书籍将与
nil
slug一起保存

在您共享的链接中,
slug
仅根据
标题构建,这是典型的方法


如果您想使用URL(如
/books/123 my title
)访问它,可以使用
String.split(id_和_slug,“-”,parts:2)之类的内容解析您的参数

谢谢您的回答和解释!就这样。在询问之前,我真的需要对文档做更多的研究。。。