【问题标题】:Rails 4 - belong_to nested object fields are not savedRails 4 - 不保存belongs_to嵌套对象字段
【发布时间】:2023-03-10 08:09:01
【问题描述】:

注意:我读过几篇类似的帖子。但没有一个解决方案对我有用。
我有两个具有一对多关系的对象 Appeal 和 Appealer。当我保存 Appeal 对象时,所有字段都被保存,并且上诉人 ID 也被保存(作为 FK)。但是在 Appealer 表中保存了一条新记录,除了 id 之外没有任何数据。

型号

class Appeal < ActiveRecord::Base
    belongs_to :appealer, :autosave => true
    accepts_nested_attributes_for :appealer
end

class Appealer < ActiveRecord::Base
    has_many :appeals, :autosave => true
end

AppealsController

class AppealsController < ApplicationController
    def index
        respond_with Appeal.all
    end

    def create
        appealer = Appealer.create(appealer_params)
        @appeal = Appeal.create(appeal_params)
        @appeal.appealer = appealer


        if @appeal.save
          respond_with @appeal
        else
          respond_with {:error}
        end
    end

    def show
        respond_with Appeal.find(params[:id])
    end

    private
    def appeal_params
        params.require(:appeal).permit(:subject, :status, :submit_means, :card_type, :submit_date, :relationship, :report_date, :explanation, :email_approval)
    end
    def appealer_params
        params.require(:appeal).permit(appealer: [:appealer_id, :first_name, :last_name])
    end
end

编辑 这是我使用的json

{
        "id": 21,
        "subject": "axxxscaaaa",
        "status": "happy",
        "submit_means": "DOAR",
        "card_type": "sdsd",
        "submit_date": 1466629200000,
        "relationship": null,
        "report_date": 1466542800000,
        "explanation": "sdsd",
        "email_approval": null,
        "appealer": {"first_name":"aaaaaaa", "last_name":"fffff"},
        "selfRequest": false,
        "created_at": 1465851600000,
        "updated_at": 1465333200000
    }

我不明白为什么上诉人的字段没有保存

【问题讨论】:

  • 是的,我已经完成了这个示例,但没有成功。
  • 你可以在appealer_params 中使用appealer_attributes 吗?喜欢这个params.require(:appeal).permit(appealer_attributes: [:appealer_id, :first_name, :last_name])。而且我相信您已经在使用fields_for 代替appealer
  • 您可能想要发布您的表单视图
  • 您收到控制器请求的参数了吗?许可证后你的参数是什么?

标签: ruby-on-rails ruby-on-rails-4 nested-attributes strong-parameters belongs-to


【解决方案1】:
  • 当您显示 JSON 对象时,您没有在视图表单上使用 rails fields_for 或其他东西。因此,您的模型中不需要此(accepts_nested_attributes_for :appealer)行。模型应该是这样的:

      class Appeal < ActiveRecord::Base
        belongs_to :appealer, :autosave => true
      end
    
  • 接下来,在您当前的逻辑中,对于您的呼吁者参数,更改呼吁者参数方法:

    def appealer_params
      params.require(:appealer).permit(:first_name, :last_name)
    end
    
  • 为您的场景创建动作逻辑:

    def create
      @appeal = Appeal.new(appeal_params)
      if appealer_params.present?
        appealer = Appealer.create(appealer_params)      
        @appeal.appealer = appealer
      end
    
      if @appeal.save
        respond_with @appeal
      else
        respond_with {:error}
      end
    end
    

【讨论】:

  • 并保持其余代码不变?如果我这样做,我会收到错误“参数丢失或值为空:上诉人”
  • 是的,在您当前的情况下,您可以保留代码原样。但是如果有可能接收到上诉人数据的空白值或没有上诉人数据。然后你需要处理它。给我确切的场景,然后我会更新我的答案。
  • 上诉人可以为null(根本没有数据),但如果有上诉人,那么所有3个字段都必须有值。
  • 我仍然收到错误“参数丢失或值为空:上诉人”。我错过了什么?
【解决方案2】:

试试这个

def appeal_params
   params.require(:appeal).permit(:subject, :status, :submit_means, :card_type, :submit_date, :relationship, :report_date, :explanation, :email_approval, appealers_attributes: [:id, :first_name, :last_name] )
end

并删除此行appealer = Appealer.create(appealer_params)

【讨论】:

  • 好的,我知道了。这是 field_for 的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多