【问题标题】:Non-ActiveRecord nested model form not taking model valuesNon-ActiveRecord 嵌套模型形式不采用模型值
【发布时间】:2015-02-19 21:41:56
【问题描述】:

我正在使用 Rails 的 form_forfields_for 获取模型具有的嵌套 json 属性的表单,但在编辑时我没有得到值,必须手动设置值:

<%= f.fields_for :json do |ff| %>
    <%= ff.text_field :attr, value: @app_configuration.json.attr %>
<% end%>

为了让我的 json attr 可读,我在我的控制器上执行此操作:

    @app_configuration.json = OpenStruct.new(JSON.parse(@app_configuration.json))

为什么我必须手动赋值?

ff.text_field 如何查找属性值?

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    您需要使用使用fields_for 声明的构建器变量ff

    <%= f.fields_for :json, @app_configuration.json do |ff| %>
        <%= ff.text_field :attr %>
    <% end%>
    

    使用f.text_field :attr 将在不存在的父模型中查找attr,以及在编辑期间看不到值的原因。

    对于非 AR 自定义对象,您还需要将第二个参数传递给 fields_for,如图所示。请参阅fields_for 上的文档。

    【讨论】:

    • 感谢您指出这一点,但这是我的复制/粘贴错误。我正在使用构建器变量ff。刚刚更新了代码。
    • 你能检查表单的对象并确保值存在吗?您可以在控制器中使用logger.debug { obj.inspect } 或在form_for 声明后使用&lt;%= f.object.inspect %&gt; 在视图文件中进行检查。
    • 我刚试过&lt;%= ff.object.inspect %&gt;,它输出为零。如果我写&lt;%= f.object.inspect %&gt; 它会输出完整的对象,但它似乎不适用于ff 构建器。问题似乎与此有关。
    • 我将json 属性转换为OpenStruct,这有问题吗?
    • 谢谢!那行得通。你能把它写成答案让我接受吗?基本上我必须写&lt;%= f.fields_for :json, @app_configuration.json do |ff| %&gt;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-06
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多