我试图提供一种方法,在一个模型中生成一个新对象(列表),在另一个模型中使用has_many关系(通过分组)生成一个新的关联对象(项目)。我能够让表单工作正常,但无法弄清楚为了正确完成创建过程,我缺少什么。
Rails v.5.1.2,Ruby v.2.4.1
lists_controller.rb
def new
@list = current_user.lists.new
3.times { @list.items.build }
end
def create
@list = current_user.lists.new(list_params)
respond_to do |format|
if @list.save
format.html { redirect_to @list, notice: 'List was successfully created.' }
format.json { render :show, status: :created, location: @list }
else
format.html { render :new }
format.json { render json: @list.errors, status: :unprocessable_entity }
end
end
end
private
def set_list
@list = List.find(params[:id])
end
def correct_user
@list = current_user.lists.find_by(id: params[:id])
redirect_to lists_path, notice: "Not authorized to edit this list"
if @list.nil?
end
def list_params
params.require(:list).permit(:title, {
item_attributes: [
:id, :title, :url
]})
end
items_controller.rb
def new
@item = Item.new
end
private
def set_item
@item = Item.find(params[:id])
end
def item_params
params.require(:item).permit(:title, :body, :url, :created,
:list_ids => [])
end
end
list.rb模型
has_many :groupings, :dependent => :destroy
has_many :items, :through => :groupings
accepts_nested_attributes_for :items,
reject_if: ->(attrs) { attrs['title'].blank? || attrs['url'].blank? }
item.rb模型
has_many :groupings, :dependent => :destroy
has_many :lists, :through => :groupings
validate :has_lists?
accepts_nested_attributes_for :lists
attr_writer :list_titles
after_save :assign_lists
def list_titles
@list_titles || lists.map(&:title).join(' ')
end
private
def assign_lists
if @list_titles
self.lists = @list_titles.split(/\,/).map do |title|
if title[0..0]==" "
title=title.strip
end
title=title.downcase
List.find_or_create_by_title(title)
end
end
end
def has_lists?
errors.add(:base, 'This item needs to be assigned to a list before it can be saved.') if self.lists.blank?
end
grouping.rb模型
belongs_to :item
belongs_to :list
accepts_nested_attributes_for :item, :list
列表形式
<%= form_with(model: list, local: true) do |f| %>
<% if list.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(list.errors.count, "error") %> prohibited this list from being saved:</h2>
<ul>
<% list.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :title %>
<%= f.text_field :title, id: :list_title %>
</div>
<div>
<p><strong>Items:</strong></p>
<%= f.fields_for :items do |item| %>
<div>
<%= item.label :title %>
<%= item.text_field :title %>
<%= item.label :url %>
<%= item.text_field :url %>
</div>
<% end %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
控制台输出示例
于2017-09-19 13:12:53-0700开始POST“/lists”127.0.0.1由ListsController#创建为HTML参数:{“utf8”=
很明显,我还在学习中——但是在尝试了这个论坛上所有相关的提示之后,我还是没有找到这个。感谢任何帮助!
当你定义你的参数时,你的语法有一些错误。应该是这样的:(items代替item并且你不需要{})
def list_params
params.require(:list).permit(:title,
items_attributes: [:id, :title, :url])
end
您快到了,但控制台日志中报告了一个错误:Unpermitted parameter::items_attributes
。
将item_attributes
更改为items_attributes
list_params:
def list_params
params.require(:list)
.permit(:title, items_attributes: [:id, :title, :url])
end
问题内容: swift没有嵌套类吗? 例如,我似乎无法从嵌套类访问主类的属性测试。 问题答案: Swift的嵌套类与Java的嵌套类不同。好吧,它们就像是Java的一种嵌套类,而不是您正在考虑的那种。 在Java中,内部类的实例会自动引用外部类的实例(除非声明了内部类)。如果您有外部类的实例,则只能创建内部类的实例。这就是在Java中您说类似的原因。 在Swift中,内部类的实例独立于外部类的任何
我有这门课: ContractDetail类如下所示:
我在一个项目中有一个奇怪的需求。加入两个n: m属性表(我将用虚拟属性呈现行为)。 第一表(idPlace、idAddress、idSchool、wage)加入1:m 当然,我有表地方,地址,学校,企业与他们各自的ID,获取,集合和属性在实体类中实现。 代码: 位置 地址 学校 第一桌 FirstTablePK 上面提到的表和联接工作得很好。现在我想把第一个表和第二个表连接起来。 企业号 现在,对
我有以下build.xml代码。在这里,我在jar文件中修改了清单文件。在清单中,我想添加一些属性,例如资产名称和资产基线。 buildInfo的内容。属性如下: build.xml:我想动态传递名称,即 articlelib 值,并从 buildInfo.properties 中检索值。我在清单外部使用了宏元数据,它是工作文件,但当我在清单标签中使用相同的时,我无法使用它。我是否可以解决此问题或
我正在尝试反序列化一个 JSON 响应,其中包含一些标准字段和一个包含子类属性的 嵌套对象,例如: 字段< code>id和< code>type是标准的,所以我有一个基类< code>Base,然后扩展一些更具体的类: 如何让杰克逊读取 对象作为进一步字段值的来源?我假设我需要创建一个自定义反序列化程序,但我不确定如何具体完成此操作。