5

Jestem nowicjuszem w środowisku Ruby on Rails i większością problemów, które udało mi się rozwiązać, ale nie byłem w stanie znaleźć rozwiązanie tego problemu.Szyny 4 i Devise - nazwa użytkownika nie jest dodawana do bazy danych, gdy nowy użytkownik utworzył

celu zapewnienia kontekstu:

  • pomocą szyn (4.0.0)
  • Stosując nadzorca (1.2.3)
  • Stosując opracowanie (3.0.0)
  • Stosując rolify (3,2 .0)
  • Korzystanie cancan (1.6.10)

Mój problem

Po zarejestrowaniu nowego użytkownika z rejestracją Devise'a. Pole: name nie jest dodawane do bazy danych. See wyjście serwer

modelu User (app/models/user.rb)

: nazwa znajduje się w attr_accessible.

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

    # Setup accessible (or protected) attributes for your model 
    attr_accessible :role_ids, :as => :admin 
    attr_accessible :name, :email, :password, :password_confirmation, :remember_me 

end 

użytkownika kontroler (app/controllers/users_controller.rb).

Dodałem białą listę params, aby zachować ją z Rails 4, ale to nie rozwiązało problemu.

class UsersController < ApplicationController 
    before_filter :authenticate_user! 

    def index 
    authorize! :index, @user, :message => 'Not authorized as an administrator.' 
    @users = User.all 
    end 

    def show 
    @user = User.find(params[:id]) 
    end 

    def update 
    authorize! :update, @user, :message => 'Not authorized as an administrator.' 
    @user = User.find(params[:id]) 
    if @user.update_attributes(params[:user], :as => :admin) 
     redirect_to users_path, :notice => "User updated." 
    else 
     redirect_to users_path, :alert => "Unable to update user." 
    end 
    end 

    def destroy 
    authorize! :destroy, @user, :message => 'Not authorized as an administrator.' 
    user = User.find(params[:id]) 
    unless user == current_user 
     user.destroy 
     redirect_to users_path, :notice => "User deleted." 
    else 
     redirect_to users_path, :notice => "Can't delete yourself." 
    end 
    end 

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_user 
     @user = User.find(params[:id]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def user_params 
     params.require(:user).permit(:name, :email, :password, :password_confirmation, :remember_me) 
    end 
end 

opracować nowy widok za rejestrację (app/views/opracowania/rejestracje/new.html.erb)

<h2>Sign up</h2> 
<%= simple_form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => {:class => 'form-vertical' }) do |f| %> 
    <%= f.error_notification %> 
    <%= display_base_errors resource %> 
    <%= f.input :name, :autofocus => true %> 
    <%= f.input :email, :required => true %> 
    <%= f.input :password, :required => true %> 
    <%= f.input :password_confirmation, :required => true %> 
    <%= f.button :submit, 'Sign up', :class => 'btn-primary' %> 
<% end %> 
<%= render "devise/shared/links" %> 

Zastosowanie Regulator (app/controllers/application_controller.rb)

Postępowałem zgodnie z instrukcjami dotyczącymi silnych parametrów i uwzględniłem podejście leniwego mężczyzny z Devise

class ApplicationController < ActionController::Base 
    # Prevent CSRF attacks by raising an exception. 
    # For APIs, you may want to use :null_session instead. 
    protect_from_forgery with: :exception 
    before_filter :configure_permitted_parameters, if: :devise_controller? 

    rescue_from CanCan::AccessDenied do |exception| 
    redirect_to root_path, :alert => exception.message 
    end 

    protected 

    def configure_permitted_parameters 
    devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:name, :email) } 
    end 
end 

Dane wyjściowe serwera podczas tworzenia nowego użytkownika.

Started POST "/users" for 127.0.0.1 at 2013-07-16 15:31:20 +1000 
Processing by Devise::RegistrationsController#create as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"TYp9xOgtdKJI62rUddU7EE1C7FDF5qnmWgGENluzaWk=", "user"=>{"name"=>"John Smith", "email"=>"[email protected]", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"Sign up"} 
Unpermitted parameters: name 
    (0.1ms) begin transaction 
    User Exists (0.1ms) SELECT 1 AS one FROM "users" WHERE "users"."email" = '[email protected]' LIMIT 1 
Binary data inserted for `string` type on column `encrypted_password` 
    SQL (0.3ms) INSERT INTO "users" ("created_at", "email", "encrypted_password", "updated_at") VALUES (?, ?, ?, ?) [["created_at", Tue, 16 Jul 2013 05:31:20 UTC +00:00], ["email", "[email protected]"], ["encrypted_password", "$2a$10$kMfZLiBm6md0zoWXd0esjO/IRHBC72444ABDKcXVhPa6mCco9pIJu"], ["updated_at", Tue, 16 Jul 2013 05:31:20 UTC +00:00]] 
    (17.0ms) commit transaction 
    (0.1ms) begin transaction 
Binary data inserted for `string` type on column `last_sign_in_ip` 
Binary data inserted for `string` type on column `current_sign_in_ip` 
    SQL (0.4ms) UPDATE "users" SET "last_sign_in_at" = ?, "current_sign_in_at" = ?, "last_sign_in_ip" = ?, "current_sign_in_ip" = ?, "sign_in_count" = ?, "updated_at" = ? WHERE "users"."id" = 3 [["last_sign_in_at", Tue, 16 Jul 2013 05:31:20 UTC +00:00], ["current_sign_in_at", Tue, 16 Jul 2013 05:31:20 UTC +00:00], ["last_sign_in_ip", "127.0.0.1"], ["current_sign_in_ip", "127.0.0.1"], ["sign_in_count", 1], ["updated_at", Tue, 16 Jul 2013 05:31:20 UTC +00:00]] 
    (1.1ms) commit transaction 
Redirected to http://0.0.0.0:3000/ 
Completed 302 Found in 94ms (ActiveRecord: 19.0ms) 

mój wniosek

Po tym wszystkim uważam, że problem leży w opracować za registration_controller, ale nie jestem do końca pewien, jak go o dostępie do kontrolera i uzupełnianiu tego, czy to jest właśnie ten problem. Mam nadzieję, że jest to coś prostego i właśnie to przeoczyłem.

Jeśli ktoś napotka na ten problem lub może oświetlić sytuację, będzie to bardzo cenne.

Pozdrawiam.

+1

Dlaczego używasz obu silnych parametrów i attr_accessible? –

+0

Użyłem generatora starterap do stworzenia podstawowej aplikacji, zawierałem linie attr_accessible, a będąc nowym na szynach, do tej pory nie znałem się lepiej - poznałem mocne parametry tego problemu. – 7sunami

Odpowiedz

10

Szyny 4 używają mocnych parametrów.

Musisz zezwolić parametrom, które chcesz przekazać przez kontroler do modelu. innymi słowy bezpośrednie powiązanie z atrybutami w modelu poprzez params jest teraz niedozwolone, musisz określić, czy jakakolwiek wartość parametru ma przechodzić przez kontroler do modelu.

można znaleźć jakąś pomoc w tym blogu: http://edgeapi.rubyonrails.org/classes/ActionController/StrongParameters.html

lub jeśli weźmiemy pod uwagę problemu można też przesłonić SessionsController dla devise lub korzystania

devise_parameter_sanitizer(:sign_up) 

więcej pomocy można znaleźć tutaj: https://github.com/plataformatec/devise#strong-parameters

2

Zakładając, że używasz wiązkę, można uzyskać dostęp do gem opracować spojrzeć na kod przez:

bundle open devise 

jeśli trzeba zastąpić standardowy kontroler opracowania, można to zrobić poprzez skopiowanie regulatora z gem do kontrolerów/devise/[nazwa pliku] w twojej aplikacji i będzie miał pierwszeństwo. Pamiętaj, że jeśli to zrobisz, będziesz musiał uważać na ulepszenia klejnotów.

jak poprzednio, dlaczego mieszacie białe listy z silnymi parametrami; Należy trzeba tylko silne parametrów w szynach 4 i opracować 3

+0

Dzięki za wgląd. Spojrzałem, ale wolałbym nie wprowadzać pełnego zastąpienia, ponieważ, jak mówisz, może to być problematyczne przy uaktualnianiu klejnotu. – 7sunami

0

znalazłem problem w application_controller:

devise_parameter_sanitizer.for(:sign_in) ... 

należy

devise_parameter_sanitizer.for(:sign_up)... 

niewielkie nadzoru w moim imieniu, dzięki za jednak pomóc.

8

Dodawanie

before_action :configure_permitted_parameters, if: :devise_controller? 

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

do mojego application_controller pracował dla mnie

UPDATE

before_action :configure_permitted_parameters, if: :devise_controller? 

def configure_permitted_parameters 
    devise_parameter_sanitizer.permit(:sign_in, keys: [:name, :email]) 
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name, :email, :password, :password_confirmation]) 
    devise_parameter_sanitizer.permit(:account_update, keys: [:name, :email, :password, :password_confirmation, :current_password]) 
end 

wygląda jak opracować zaktualizowany ich dokumentów i chcą mu konfigurację jak powyżej.

+0

: email: hasło powinno być: email,: hasło –

+0

Dzięki @RichardGrossman, poprawione. – codermyles

Powiązane problemy