更新将用户属性设置为来自另一个控制器的嵌套属性

时间:2016-08-14 07:56:38

标签: ruby-on-rails validation devise updates

我有用户模型和每个用户has_one个人资料模型。我想更新个人资料模型。但是在User模型中只有两个属性(first_name和last_name)。所以我使用了accepts_nested_attributes_for

当我调用更新操作时,我在配置文件模型上收到以下错误:

  1. 电子邮件不能为空
  2. 密码不能为空
  3. 以下我的代码:

    用户模型:

    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中不在设计控制器中)??

2 个答案:

答案 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