首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >提交后Tagify与Rails 7结合JSON标记

提交后Tagify与Rails 7结合JSON标记
EN

Stack Overflow用户
提问于 2022-08-21 04:13:22
回答 1查看 95关注 0票数 2

我在Rails 7应用程序上使用@yairEO/tagify。我几乎可以用了。它将作为有效的JSON保存到数据库中。如果在返回表单进行编辑之后,使用带有3个标记(例如tag1tag2tag3 )的标签提交表单,那么标签化将这3个单独的标记组合成一个标签。

从数据库:

代码语言:javascript
复制
[
  {
    "value":"tag1"
  },
  {
    "value":"tag2"
  },
  {
    "value":"tag3"
  }
]

来自irb recipe.tags

代码语言:javascript
复制
[
  {
    "value"=>"tag1"
  },
  {
    "value"=>"tag2"
  },
  {
    "value"=>"tag3"
  }
]

在提交之前:

提交后:

当增加不良反应时,事情很快就失控了。在提交之前:

提交后:

application.js

代码语言:javascript
复制
import Tagify from "@yaireo/tagify"

document.addEventListener('turbo:load', (event) => {
  new Tagify(document.querySelector('#recipe_tags'));
});

recipes_controller.rb

代码语言:javascript
复制
def update
  @recipe.update(tags: JSON.parse(params[:recipe][:tags]))

  if @recipe.update(recipe_params)
    redirect_to @recipe
  else
    render :edit, status: :unprocessable_entity
  end
end
代码语言:javascript
复制
def recipe_params
  params[:recipe][:tags] = JSON.parse(params[:recipe][:tags])
  params.require(:recipe).permit(
    :title, :subtitle, :tags
  )
end

edit.html.erb

代码语言:javascript
复制
<div>
  <%= form.label :tags %><br>
  <%= form.text_field :tags %>
  <% recipe.errors.full_messages_for(:tags).each do |message| %>
    <div><%= message %></div>
  <% end %>
</div>

schema.rb

代码语言:javascript
复制
  create_table "recipes", force: :cascade do |t|
    t.string "title"
    t.string "subtitle"
    t.jsonb "tags", default: {}, null: false
    t.index ["user_id"], name: "index_recipes_on_user_id"
  end
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-01 15:03:56

问题是Rails返回了一个Hash,但是表单需要JSON。

为了解决这个问题,我将表单中的数据转换为json:

代码语言:javascript
复制
<%= form.label tags %>
<%= form.text_field(tags, value: recipe[tags].to_json) %>

另外,为了把它弄干,我继续从recipes_controller.rb中删除了这些

@recipe.update(tags: JSON.parse(params[:recipe][:tags]))

params[:recipe][:tags] = JSON.parse(params[:recipe][:tags])

然后将其添加到菜谱模型中:

代码语言:javascript
复制
protected

def convert_to_json
  self.tags = JSON.parse(tags) unless tags.empty?
end

但是,在转换之前,我们需要确保它是有效的JSON,否则我们最终会陷入最初的混乱:

代码语言:javascript
复制
private

def valid_json?(value)
  result = JSON.parse(value)

  result.is_a?(Hash) || result.is_a?(Array)
rescue JSON::ParserError, TypeError
  false
end

然后convert_to_json变成... unless tags.empty? || !valid_json?(tags)

现在似乎工作正常了!如果有人对如何使这个变得更干净/更快/更好有任何建议,请告诉我们。谢谢

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73431599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档