簡體   English   中英

為什么在保存用戶時Devise會顯示這些錯誤?

[英]Why does Devise show these errors when saving user?

在此處輸入圖片說明

#view/devise/registrations/new.html.erb


    <div class="authform">
  <%= resource%>
  <%= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :role => 'form'}) do |f| %>
    <h3>Sign up</h3>
    <%= devise_error_messages! %>

      <div class="form-group">
          <%= f.label :avatar, class: 'col-sm-2 control-label'  %>
          <div class="col-sm-6">
              <%= f.file_field :avatar %>
          </div>
      </div>

      <br>
    <div class="form-group">
      <%= f.label :Имя %>
      <%= f.text_field :first_name, :autofocus => true, class: 'form-control' %>
    </div>
    <div class="form-group">
      <%= f.label :Фамилия %>
      <%= f.text_field :last_name, :autofocus => true, class: 'form-control' %>
    </div>


    <div class="form-group">
      <%= f.label :Страна %>
      <%= collection_select(:city, :country_id, Country.all, :id, :name) %>
    </div>

    <div class="form-group">
      <%= f.label :Город %>
     <%= collection_select(f, :city_id, City.all, :id, :name) %>
    </div>

    <div class="form-group">
      <%= f.label :email %>
      <%= f.email_field :email, class: 'form-control' %>
    </div>
    <div class="form-group">
      <%= f.label :Пароль %>
      <%= f.password_field :password, class: 'form-control' %>
    </div>
    <div class="form-group">
      <%= f.label :password_confirmation %>
      <%= f.password_field :password_confirmation, class: 'form-control' %>
    </div>
     <%= f.submit 'Sign up', :class => 'button right' %>
  <% end %>
</div>

<%= render "devise/shared/links" %>

在這里,我想輸入一個city_id的輸入形式,但是在舊版本的某個地方(您可以從注釋中看到),我將它們作為字符串引入,現在我得到了錯誤。

#application_controller.rb
class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  #force_ssl
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    added_attrs = [:first_name, :last_name, :email, :avatar,:conversation_params,
             :city_id, :message_params, :password, :password_confirmation, :remember_me]
    devise_parameter_sanitizer.permit :sign_up, keys: added_attrs
    devise_parameter_sanitizer.permit :account_update, keys: added_attrs
  end

  def after_sign_in_path_for(resource)
    request.env['omniauth.origin'] || stored_location_for(resource) || user_path(resource)
  end
end

這個針對城市和國家的遷移文件

# migration file 
class AddCounriesAndCitiesToUser < ActiveRecord::Migration[5.0]
  def change
    add_column :users, :city_id, :integer

    create_table :cities do |t|
      t.string   :name
      t.integer  :country_id
    end
    create_table :countries do |t|
      t.string   :name
    end
  end
end

簡要介紹models / user.rb

  belongs_to :country
  belongs_to :city

和city.rb

class City < ApplicationRecord
    belongs_to :country
    has_many :users
end

我不太明白錯誤在哪里..

我認為在您允許的參數中,您要在兩個不同的表中添加一列嗎? 一觸即發?

嘗試像這樣轉換您的代碼

def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up , keys: [:email, :password, :remember_me, :city, :country ])
devise_parameter_sanitizer.permit(:sign_in , keys: [:email, :password, :remember_me])
devise_parameter_sanitizer.permit(:account_update , keys: [:email, :password, :password_confirmation, :current_password ])

結束

嘗試理解這段代碼

或者您可以將代碼轉換為此

我有用戶模型和老師模型

用戶登錄時,我使用devise進行身份驗證

這是代碼

    <h2>Sign up</h2>
  <% resource.build_teacher if resource.teacher.nil? %>
 <%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
    <div class="field">
      <%= teacher_fields.text_field :firstname, placeholder: 'First Name' %>
      <%= teacher_fields.text_field :lastname, placeholder: 'Last Name' %>
    </div>
<% end %>

<div class="field">
<%= f.label :email %><br />
<%= f.email_field :email, autofocus: true %>
</div>

 <div class="field">
<%= f.label :password %>
<% if @minimum_password_length %>
<em>(<%= @minimum_password_length %> characters minimum)</em>
<% end %><br />
<%= f.password_field :password, autocomplete: "off" %>
</div>

<div class="field">
<%= f.label :password_confirmation %><br />
<%= f.password_field :password_confirmation, autocomplete: "off" %>
</div>
<div class="actions">
<%# raise params %>
<%= f.submit 'Sign up' %>
</div>

<% end %>

我以這種形式填寫電子郵件,密碼,名字和姓氏

電子郵件,密碼用於用戶模型,名字,姓氏用於教師模型

這是我的用戶模型user.rb

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

has_one :teacher, dependent: :destroy
accepts_nested_attributes_for :teacher
end

這是我的老師。rb

class Teacher < ApplicationRecord
belongs_to :user
validates :firstname, uniqueness: {scope: :lastname}, presence: true
validates :lastname, presence: true
end

我的application_controller

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


def new
# Override Devise default behaviour and create a profile as well
build_resource({})
resource.build_teacher
respond_with self.resource
end

protected

def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up , keys: [:email, :password, :remember_me, :teacher_attributes => [:user_id, :firstname, :lastname]])
devise_parameter_sanitizer.permit(:sign_in , keys: [:email, :password, :remember_me])
devise_parameter_sanitizer.permit(:account_update , keys: [:email, :password, :password_confirmation, :current_password ])

end

end

我認為我們有相似之處,如果我有錯誤,可以發表評論,我會接受它,我也會接受它,這也是Ruby在Rails中的新內容

確定設計的問題..驗證

我只是從models / user.rb刪除

  belongs_to :country
  belongs_to :city

並將其添加到控制器

class UsersController < ApplicationController
  before_filter :authenticate_user!, exception: [:show, :index]
  protect_from_forgery

  def index
    user_up
  end

  def show
    user_up
    @user = User.find(params[:id])
    @user_city = City.find_by id: @user.city_id
    @user_country = Country.find_by id: @user_city.country_id
  end

private  

  def user_up
    @users = User.all
    @city = City.all
    @country = Country.all
  end

end

並更新視圖中的選擇

<div class="form-group">
  <%= f.label :City %>
  <%= f.collection_select(:city_id, City.all, :id, :name) %>
</div>

並在show方法中添加此代碼

  <p>Country: <%= @user_country.name%></p>
  <p>City: <%= @user_city.name%></p>

我認為它可以幫助您。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM