【问题标题】:slug contains a nil valueslug 包含一个 nil 值
【发布时间】:2021-04-19 09:05:07
【问题描述】:

我在 elixircasts 页面上关注了this episode。我在创建新记录时遇到问题。当我尝试添加一本新书时,我遇到了这样的错误

cannot convert Bookstore.Inventory.Book to param, key :slug contains a nil value

我不知道我的代码哪里出了问题。我已经编写了相同的代码来为作者的页面创建 slug,并且它可以工作。如果能指出我犯错的地方,我将不胜感激。 我正在使用{:slugify, "~> 1.3"}

库存/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

库存.ex

  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

【问题讨论】:

    标签: elixir phoenix-framework


    【解决方案1】:

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

    在您分享的链接中,slug 仅从 title 构建,这是典型的方法。

    如果您想使用诸如 /books/123-my-title 之类的 URL 访问它,则可以使用诸如 String.split(id_and_slug, "-", parts: 2) 之类的东西来解析您的参数。

    【讨论】:

    • 感谢您的回答和解释!就是这样。在询问之前我真的需要在文档中做更多的研究......
    猜你喜欢
    • 2016-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-21
    • 2018-08-07
    • 2013-07-13
    • 2021-09-21
    相关资源
    最近更新 更多