2

Я пробовал все, что я могу найти, в том числе то, что находится в Devise README (https://github.com/plataformatec/devise#strong-parameters), это более наглядное представление о README (http://blog.12spokes.com/web-design-development/adding-custom-fields-to-your-devise-user-model-in-rails-4/comment-page-1/#comment-26217), и каждый ответ, который я нахожу в StackOverflow, кажется совместимым с этими двумя решениями. Все эти решения приводят к одной и тем же ошибкам: 2 ошибки запрещенных этому пользователя из спасаемых: - Email не может быть пустым - Пароль не может быть пустымНевозможно добавить пользовательские поля в пользовательскую модель Devise в Rails 4 с сильными параметрами

Я также попытался в том числе Gem «protected_attributes» в gemfile и запуске пакета, чтобы я мог использовать attr_accessible, а не сильные параметры. При таком подходе оказалось, что я смог сохранить пользователя в порядке, но ни одно из моих полей, обычае или ином, на самом деле не сохранялось. Они все остались ноль. Я также попытался вернуться к предыдущей версии, где был использован attr_accessible, а не сильные параметры, и это привело к той же проблеме, когда ничего не сохранилось.

Я нахожусь в полной готовности с этим в настоящий момент, поэтому любые идеи по другим решениям, которые могут работать, будут очень благодарны ... Спасибо заранее!

EDIT: Вот мой контроллер приложения:

class ApplicationController < ActionController::Base 
    before_filter :configure_permitted_parameters, if: :devise_controller? 

    protected 

    def configure_permitted_parameters 
     devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:profile_name, :email, :password) } 
     devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:first_name, :last_name, :profile_name, :email, :password, :password_confirmation) } 
     devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:first_name, :last_name, :profile_name, :email, :password, :password_confirmation, :current_password) } 
    end 


    # Prevent CSRF attacks by raising an exception. 
    # For APIs, you may want to use :null_session instead. 
    protect_from_forgery with: :exception 

end 
+0

что делает ваш пользовательский вид контроллера, как? Вы добавили метод для сильных параметров в контроллере? –

+0

Я передаю сильные параметры моей модели пользователя через свой контроллер приложений.Я добавил свой код к моему оригинальному вопросу. Спасибо за вашу помощь! Пожалуйста, дайте мне знать, если вам нужна какая-либо другая информация. – Jake

+0

Этот урок помог мне с такими проблемами. В случае, если это помогает кому-то еще: http://www.jacopretorius.net/2014/03/adding-custom-fields-to-your-devise-user-model-in-rails-4.html – 0112

ответ

3

Я создал пример приложения, и это работает для меня.

user.rb

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

в DEViSE регистрации new.html.erb вид

<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %> 
    <%= devise_error_messages! %> 

    <div><%= f.label :firstname %><br /> 
    <%= f.text_field :firstname, :autofocus => true %></div> 

    <div><%= f.label :lastname %><br /> 
    <%= f.text_field :lastname %></div> 

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

    <div><%= f.label :password %><br /> 
    <%= f.password_field :password %></div> 

    <div><%= f.label :password_confirmation %><br /> 
    <%= f.password_field :password_confirmation %></div> 

    <div><%= f.submit "Sign up" %></div> 
<% end %> 

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

и миграции devise_create_user

class DeviseCreateUsers < ActiveRecord::Migration 
    def change 
    create_table(:users) do |t| 
     ## Database authenticatable 
     t.string :firstname 
     t.string :lastname 
     t.string :email,    :null => false, :default => "" 
     t.string :encrypted_password, :null => false, :default => "" 

     ## Recoverable 
     t.string :reset_password_token 
     t.datetime :reset_password_sent_at 

     ## Rememberable 
     t.datetime :remember_created_at 

     ## Trackable 
     t.integer :sign_in_count, :default => 0, :null => false 
     t.datetime :current_sign_in_at 
     t.datetime :last_sign_in_at 
     t.string :current_sign_in_ip 
     t.string :last_sign_in_ip 

     ## Confirmable 
     # t.string :confirmation_token 
     # t.datetime :confirmed_at 
     # t.datetime :confirmation_sent_at 
     # t.string :unconfirmed_email # Only if using reconfirmable 

     ## Lockable 
     # t.integer :failed_attempts, :default => 0, :null => false # Only if lock strategy is :failed_attempts 
     # t.string :unlock_token # Only if unlock strategy is :email or :both 
     # t.datetime :locked_at 

     t.string :authentication_token 


     t.timestamps 
    end 

    add_index :users, :email,    :unique => true 
    add_index :users, :reset_password_token, :unique => true 
    # add_index :users, :confirmation_token, :unique => true 
    # add_index :users, :unlock_token,   :unique => true 
    end 
end 

в маршрутах

Topic::Application.routes.draw do 

    devise_for :users#, controllers: { registrations: "registrations" } 

    resources :maintopics do 
    resources :subtopics 
    end 
end 

и контроллер приложения

class ApplicationController < ActionController::Base 
    # Prevent CSRF attacks by raising an exception. 
    # For APIs, you may want to use :null_session instead. 

    before_filter :configure_permitted_parameters, if: :devise_controller? 

    def configure_permitted_parameters 
    devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:firstname, :lastname, :email, :password, :password_confirmation) } 
    end 

    protect_from_forgery with: :exception 

end 

В вашем случае я думаю, что есть проблема параметров так создать новый регистрационный контроллер и добавьте в него следующий код для проверки значения параметров.

class RegistrationsController < Devise::RegistrationsController 

    def create 
    raise params.inspect 
    end 
end 

в файле маршрутов заменить существующие следующей строкой.

devise_for :users, controllers: { registrations: "registrations" } 
+0

Hi Amit, это выглядит очень похоже на то, что я уже делаю в своем контроллере приложений. См. Мой отредактированный вопрос выше. Это сейчас не работает для меня. Спасибо за вашу помощь! Пожалуйста, дайте мне знать, если вам нужна какая-либо другая информация. – Jake

+0

вы получаете эту ошибку '2 ошибки запретили этому пользователю сохранять: - электронная почта не может быть пустым - пароль не может быть пустым', потому что не удается получить эти параметры. –

+0

@Jake Проверьте мой отредактированный ответ! –

0

Кроме того, необходимо добавить сильный метод parmeters к контроллеру пользователя:

def update 
    person = current_account.people.find(params[:id]) 
    person.update_attributes!(person_params) 
    redirect_to person 
end 

private 

def person_params 
    params.require(:person).permit(:name, :age) 
end 
+0

Спасибо за быстрый ответ Джейсон! Я собираюсь попробовать это вместе с предложениями Амита, когда я вернусь домой с работы сегодня вечером. Я дам вам знать, что я нахожу. Еще раз спасибо! – Jake

+0

Эй, Джейсон, просто понял, что это из 12 примеров спиц, которые я представил ... но затем автор далее указывает: ** Используя это в качестве примера, вы можете подумать, что способ включить поля first_name и last_name в ваша модель будет выглядеть примерно так: def user_params params.require(:user).permit(:first_name, :last_name) end Это хорошее предположение, но поскольку мы используем Devise, это немного сложнее. Чтобы понять, почему, нам нужно посмотреть, как Devise реализует параметрическую дезинфекцию, когда сильные параметры используются. ** Его исправление не работает для меня. Благодаря! – Jake