【问题标题】:Rails Devise: Render and Update Multiple Model Fields on FormRails 设计:在表单上渲染和更新多个模型字段
【发布时间】:2018-12-21 06:46:46
【问题描述】:

我创建了一个使用 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

我无法使用此表单来渲染和更新模型。我希望有人能告诉我我做错了什么。

【问题讨论】:

    标签: ruby-on-rails devise


    【解决方案1】:

    试试这个:

    • 移动configure_permitted_parameters和对应 before_actionApplicationController
    • 删除UsersController,好像不需要了
    • 稍微更改设计允许的参数:u.permit(:email, :password, profile_attributes: [:id, :first_name, :last_name])

    【讨论】:

    • 按照建议移动了参数。仍然需要用户控制器。不太清楚为什么。
    • 我记不太清了。这是一个路由错误,说找不到用户控制器......即使我已经删除了所有引用。在重新选举时,也许我应该通过 rails d 控制器用户命令正确地销毁它。
    • @JimmyD,也许你忘了从routes.rb 中删除它?
    • 我确实从 routes.rb 文件中删除了它...但是当我通过 rails 命令(g 控制器)创建它时,我认为我应该通过 rails destroy 命令删除它。我实际上所做的只是手动删除文件
    • @JimmyD,删除文件应该足够了。如果你愿意,你可以再次删除它并在 SO 上创建一个新问题(带有完整的错误跟踪和 routes.rb),我会尽力帮助你
    【解决方案2】:

    删除用户控制器和

    在应用程序控制器中

    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
    

    你可以根据你的使用改变路径....

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-07
      • 2015-01-07
      • 1970-01-01
      • 1970-01-01
      • 2011-05-18
      • 2012-12-13
      • 2010-11-18
      • 2015-08-19
      相关资源
      最近更新 更多