6

我有一个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

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

4

4 回答 4

3

你应该可以这样做:

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

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

于 2015-04-09T08:46:07.847 回答
3

你可以这样做:

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

然后您将可以访问 blog、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

希望能帮助到你!

于 2017-02-14T12:36:56.053 回答
2

设置@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])
于 2017-05-30T21:26:20.187 回答
0

如果您不想定义访问器,您可以执行以下操作:

= 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

于 2022-01-04T14:14:52.227 回答