Rails Devise:在表单上渲染和更新多个模型字段

时间:2018-12-18 06:54:45

标签: ruby-on-rails devise

我已经创建了一个使用devise的简单Rails应用。对于登录和注销,我使用具有电子邮件和密码的标准USER模型。我有一个PROFILE模型来存储用户的所有其他详细信息。

我想创建一个页面,用户可以在其中更新所有详细信息。当前出现以下错误...

  

UsersController#update中的NoMethodError

     

nil:NilClass的未定义方法“名称”

Screenshot of entire error message

我的模特看起来很……

class User < ApplicationRecord
    Include default devise modules. Others available are:
    :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
    devise :database_authenticatable, :registerable, :recoverable,  :rememberable, :validatable

      has_one :profile
      after_create :create_profile
      attr_accessor :first_name, :last_name, :description

      accepts_nested_attributes_for :profile

    end

        class Profile < ApplicationRecord
         belongs_to :user
        end

查看页面代码看起来像...

<h1>Account Details</h1>

<p><strong>Email:</strong>    <%= @user.email %></p>
<p><strong>First Name:</strong> <%= @user.profile.first_name %></p>
<p><strong>Last Name:</strong> <%= @user.profile.last_name %></p>

<%= form_for(@user, :as => :user) do |field| %>
<p>
<%= field.label :email  %>
<%= field.text_field :email %>
</p>
<%= fields_for @user.profile do |profile| %>
  <p>
    <%= profile.label :first_name %><br>
    <%= profile.text_field :first_name %>
    <% end %>
  </p>
  <p>
  <%= field.submit "Update" %>
  </p>
<% end %>

控制器看起来像

    Class UsersController < Devise::RegistrationsController

    def new
        build_resource({})
        resource.build_profile
        respond_with self.resource
    end

    def create
        super
    end

    def edit
        super
    end

    def update
        @user = current_user
    end

    def show
        @user = current_user
    end

    before_action :configure_permitted_parameters, if: :devise_controller?

 protected

 def configure_permitted_parameters
   devise_parameter_sanitizer.permit(:sign_up) { |u|
     u.permit(:email, :password, [profile_attributes: [ :first_name, :last_name]])
}
end 

end

我无法获得此表格来渲染和更新模型。我希望有人能告诉我我在做什么错。

2 个答案:

答案 0 :(得分:1)

尝试一下:

  • 移动configure_permitted_parameters和相应的 before_actionApplicationController
  • 删除UsersController,看起来您不需要它
  • 稍微修改允许的参数:u.permit(:email, :password, profile_attributes: [:id, :first_name, :last_name])

答案 1 :(得分:0)

删除UsersController和

在application_controller中

class ApplicationController<ActionController::Base
  protect_from_forgery with::exception
  before_action:configure_permitted_parameters,if::devise_controller? 

def check_is_admin
 if current_user.is_admin
  return true
 else
   redirect_to roots_path,notice:"page looking for sign_in"
 end
end

private

def after_sign_out_path_for(resource_or_scope)
new_user_session_path
end

def after_sign_in_path_for(resource_or_scope)
root_path
end

protected
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up,keys:[:first_name, :last_name])
devise_parameter_sanitizer.permit(:account_update,keys:[:first_name, :last_name])
end

end

您可以根据自己的用途更改路径。...