当前位置: 首页 > 知识库问答 >
问题:

通过关联has_many嵌套属性的 Rails 嵌套属性不创建

洪开济
2023-03-14

我试图提供一种方法,在一个模型中生成一个新对象(列表),在另一个模型中使用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”=

很明显,我还在学习中——但是在尝试了这个论坛上所有相关的提示之后,我还是没有找到这个。感谢任何帮助!

共有2个答案

何涵忍
2023-03-14

当你定义你的参数时,你的语法有一些错误。应该是这样的:(items代替item并且你不需要{})

def list_params
  params.require(:list).permit(:title,
  items_attributes: [:id, :title, :url])
end
微生毅
2023-03-14

您快到了,但控制台日志中报告了一个错误:Unpermitted parameter::items_attributes

item_attributes更改为items_attributeslist_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,然后扩展一些更具体的类: 如何让杰克逊读取 对象作为进一步字段值的来源?我假设我需要创建一个自定义反序列化程序,但我不确定如何具体完成此操作。