【问题标题】:Rails simple_form create form when column type is JSON当列类型为 JSON 时,Rails simple_form 创建表单
【发布时间】:2015-03-01 18:54:27
【问题描述】:

我有一个包含三列的模型 (FooBar):

Foo -> String
Bar -> JSON
Baz -> String

我想为这个模型创建一个表单

Bar 的默认属性为:{zing: {}, zaz: {}, laz: {}}

我想要以下输入:

f.input :foo
f.input :zing
f.input :zaz
f.input :laz
f.input :baz

我尝试使用 fields_for 执行此操作,并传入每个键并将其转换为符号:

bar.each do |k,v|
f.input k.to_sym
end

但我得到的错误是 FooBar 有未定义的 :zaz 方法

任何想法都将不胜感激,谢谢。

【问题讨论】:

    标签: ruby-on-rails simple-form simple-form-for


    【解决方案1】:

    你应该可以这样做:

    f.simple_fields_for :bar do |bar_f|
      bar.each do |k,v|
       bar_f.input k.to_sym
      end
    end
    

    不要忘记允许控制器中的参数。

    【讨论】:

      【解决方案2】:

      你可以这样做:

      class User < ActiveRecord::Base
        serialize :preferences, HashSerializer
        store_accessor :preferences, :blog, :github, :twitter
      end
      

      然后您将可以访问博客、github 和 twitter,就好像它们是模型中的普通属性一样,您的表单将如下所示:

      = simple_form_for(@user, html: { class: "form" }) do |f|
        = f.input :blog
        = f.input :github
        = f.input :twitter
      

      您在此链接中有更多信息! https://github.com/plataformatec/simple_form/wiki/Nested-inputs-for-key-value-hash-attributes

      希望对你有帮助!

      【讨论】:

        【解决方案3】:

        设置@temp 变量

        @temp = FooBar.new
        @temp.data = {zing: "", zaz: "", laz: ""}
        

        此代码适用于我

        <%= simple_form_for @temp do |f| %>
          <%= f.simple_fields_for :data do |data_f| %>
            <% @temp.data.each do |k,v| %>
              <%= data_f.input k.to_sym %>
            <% end %>
          <% end %>
          <%= f.button :submit %>
        <% end %>
        

        不要忘记权限参数

        params.require(:temp).permit(data: [:zing, :zaz, :laz])
        

        【讨论】:

        • 如何显示输入框的值。它不会用值填充输入框
        【解决方案4】:

        如果你不想定义访问器,你可以这样做:

        = simple_form_for(@foo_bar) do |f|
          = f.simple_fields_for :bar do |bf|
            = bf.input :zing, input_html: { value: f.object.bar[:zing] }
            = bf.input :zaz, input_html: { value: f.object.bar[:zaz] }
            = bf.input :laz, input_html: { value: f.object.bar[:laz] }
        

        您需要在控制器中使用 {} 初始化 bar

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-22
          • 1970-01-01
          • 2018-04-11
          • 1970-01-01
          相关资源
          最近更新 更多