我有用户模型和每个用户has_one
个人资料模型。我想更新个人资料模型。但是在User模型中只有两个属性(first_name和last_name)。所以我使用了accepts_nested_attributes_for
。
当我调用更新操作时,我在配置文件模型上收到以下错误:
以下我的代码:
用户模型:
class User < ActiveRecord::Base
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable,
:confirmable
has_one :profile
end
个人资料模型:
class Profile < ActiveRecord::Base
belongs_to :user
accepts_nested_attributes_for :user
end
配置文件控制器 - 更新操作
class ProfilesController < ApplicationController
def profile_params
params.require(:profile).permit(:current_city_id, :current_country_id, :google_plus_page_url, :linkedin_page_url, :facebook_page_url, :skype_id, :user_attributes => [:first_name, :last_name])
end
def update
@profile = Profile.find_by_id(params[:profile_id])
respond_to do |format|
if @profile.update(profile_params)
format.json { render :show, status: :ok, location: @profile }
else
format.json { render json: @profile.errors, status: :unprocessable_entity }
end
end
end
end
那么,如何在没有电子邮件的情况下使用用户的嵌套属性更新配置文件&amp;密码(在Profile Controller中不在设计控制器中)??
答案 0 :(得分:0)
对于新的搜索者,今天遇到了这个问题。经过数小时的搜索并没有失败之后,我试图将id
添加为嵌套devise模型字段的hidden_field
。它解决了我的问题。
例如:
<%= form.fields_for :users do |f| %>
<%= f.hidden_field :id %>
<%= f.text_field :firstname %>
<%= f.text_field :lastname %>
<% end %>
无需更新或覆盖设计验证。
奇怪。如果您未在嵌套字段中添加设计模型id
,则更新会将嵌套模型的动作视为create
动作,从而导致设计者要求email
和{ {1}}字段。
令人沮丧。 Rails日志中没有创建操作的迹象。如果只有迹象表明该动作继续进行到password
,那早就解决了。
谢谢。
答案 1 :(得分:-2)
我认为accepts_attributes_for
应该在User
模型而不是Profile
模型上。
用户模型
class User < ActiveRecord::Base
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable,
:confirmable
has_one :profile
accepts_nested_attributes_for :profile
end
个人资料模型
class Profile < ActiveRecord::Base
belongs_to :user
end