Rails表单助手:一种形式的多个嵌套模型,例如“ Article.comments”?

问题描述

这是嵌套的Article模型form_withComment的{​​{1}}视图帮助器,来自Rails“入门”指南(https://guides.rubyonrails.org/getting_started.html):

Article.comments

<p>
  <strong>Title:</strong>
  <%= @article.title %>
</p>
 
<p>
  <strong>Text:</strong>
  <%= @article.text %>
</p>
 
<h2>Add a comment:</h2>
<%= form_with(model: [ @article,@article.comments.build ],local: true) do |form| %>
  <p>
    <%= form.label :commenter %><br>
    <%= form.text_field :commenter %>
  </p>
  <p>
    <%= form.label :body %><br>
    <%= form.text_area :body %>
  </p>
  <p>
    <%= form.submit %>
  </p>
<% end %>
 
<%= link_to 'Edit',edit_article_path(@article) %> |
<%= link_to 'Back',articles_path %>

class Article < ApplicationRecord
  has_many :comments
  validates :title,presence: true,length: { minimum: 5 }
end

现在,我想知道是否可以使用class Comment < ApplicationRecord belongs_to :article end 助手或其他助手或助手组合来创建或编辑带有多个嵌套模型的新Article,例如Comment,标签 ...以及文章可能组成的进一步模型。

...会创建合理且有用的params-Hash(因为我自己的解决方案带有“ fields_for”表单助手,因此不会产生所需或有用的params哈希。

这是params-hash的样子:

form_with

问题是控制器/商品ID未包含在<ActionController::Parameters {"utf8"=>"✓","_method"=>"patch","authenticity_token"=>"BeCtYS/U6lugXzzpltEBsMXAiD0x7z28iBUblHiza379p4YqRcd+ykgd49o53oOrC8o+iPhtWnvQQHe0ugCJow==","article"=>{"parent_article_id"=>"","title"=>"Überschrift","text"=>"Toller Text"},"tags"=>{"name"=>"Rails"},"commit"=>"Update Article","controller"=>"articles","action"=>"update","id"=>"1"} permitted: false> 键下。我不知道该如何解决strong_parameters,我什至不想。我希望Rails遵循最小惊讶原则运行,而不是通过黑客手段使事情正常运行。

在这种情况下,我希望是我自己的无知和对表单帮助者的了解,阻止了Rails生成适当的参数哈希。

谢谢。

解决方法

铁路应该按照您的预期进行。 来自accepts_nested_attributes

请考虑拥有多个帖子的成员:

class Member < ActiveRecord::Base
  has_many :posts
  accepts_nested_attributes_for :posts
end

您现在可以通过成员的属性哈希值来设置或更新关联帖子的属性:包括键:posts_attributes并将帖子属性的哈希数组作为值。

对于每个没有id密钥的哈希,除非>哈希还包含一个评估为true的_destroy密钥,否则将实例化一条新记录。

params = { member: {
  name: 'joe',posts_attributes: [
    { title: 'Kari,the awesome Ruby documentation browser!' },{ title: 'The egalitarian assumption of the modern citizen' },{ title: '',_destroy: '1' } # this will be ignored
  ]
}}


member = Member.create(params[:member])
member.posts.length # => 2
member.posts.first.title # => 'Kari,the awesome Ruby documentation browser!'
member.posts.second.title # => 'The egalitarian assumption of the modern citizen'

您显示的 参数散列很奇怪。看来您是在手动建立parent_article_id之类的断开连接的字段,而不是实际使用form_withfields_for的功能。

我需要查看 视图和控制器代码,以了解如何实现form_withfields_for来帮助您以所需的方式嵌套这些参数

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...