Rails 4 - belong_to 嵌套对象字段未保存
Rails 4 - belong_to nested object fields are not saved
注意:我读过一些与此类似的帖子。但是没有一个解决方案适合我。
我有两个具有一对多关系的对象 Appeal 和 Appealer。当我保存上诉对象时,所有字段都被保存,上诉者 ID 也被保存(作为 FK)。但是在 Appealer table 中保存了一条新记录,除了 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
上诉控制器
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
}
不明白为什么申诉人的字段没有保存
试试这个
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)
当您 JSON 显示对象时,您没有使用 rails fields_for 或视图表单上的其他内容。因此,您的模型中不需要此( accepts_nested_attributes_for :appealer )行。模型应该是这样的:
class Appeal < ActiveRecord::Base
belongs_to :appealer, :autosave => true
end
接下来,按照您当前的逻辑,对于您的 appealer_params,将 appealer_params 方法更改为:
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
注意:我读过一些与此类似的帖子。但是没有一个解决方案适合我。
我有两个具有一对多关系的对象 Appeal 和 Appealer。当我保存上诉对象时,所有字段都被保存,上诉者 ID 也被保存(作为 FK)。但是在 Appealer table 中保存了一条新记录,除了 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
上诉控制器
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
}
不明白为什么申诉人的字段没有保存
试试这个
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)
当您 JSON 显示对象时,您没有使用 rails fields_for 或视图表单上的其他内容。因此,您的模型中不需要此( accepts_nested_attributes_for :appealer )行。模型应该是这样的:
class Appeal < ActiveRecord::Base belongs_to :appealer, :autosave => true end
接下来,按照您当前的逻辑,对于您的 appealer_params,将 appealer_params 方法更改为:
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