نموذج المستخدم لن التحديث
-
21-12-2019 - |
سؤال
حاولت تحديث القائمة المستخدم:
تحكم-قصاصة
def account_settings
@user = current_user
end
def set_account_info
old_user = current_user
# verify the current password by creating a new user record.
@user = User.authenticate_by_username(old_user.username, params[:user][:password])
# verify
if @user.nil?
@user = current_user
@user.errors[:password] = "Das eingegebene Passwort ist falsch."
render :action => "account_settings"
else
# update the user with any new username and email
@user.update(params[:user])
# Set the old email and username, which is validated only if it has changed.
@user.previous_email = old_user.email
@user.previous_username = old_user.username
if @user.valid?
# If there is a new_password value, then we need to update the password.
@user.password = @user.new_password unless @user.new_password.nil? || @user.new_password.empty?
@user.save
flash[:notice] = 'Benutzerkonto-Einstellungen wurden übernommen.'
redirect_to :root
else
flash[:error] = @user.username
render :action => "account_settings"
end
end
end
أنا بالفعل حاولت بعد ، وضع و التصحيح الأسلوب.
الطريق-قصاصة
Calendar::Application.routes.draw do
root "welcome#index"
get "user/account_settings" => "user#account_settings"
patch "user/account_settings" => "user#set_account_info"
end
المستخدم نموذج
class User < ActiveRecord::Base
attr_accessible :email, :username, :previous_email, :previous_username, :password, :password_confirmation, :new_password, :new_password_confirmation
attr_accessor :password, :new_password, :previous_email, :previous_username
before_save :encrypt_password
validates_confirmation_of :password
validates_confirmation_of :new_password, :if => Proc.new {|user| !user.new_password.nil? && !user.new_password.empty? }
validates_presence_of :password, :on => :create
validates_presence_of :email, :if => Proc.new {|user| user.previous_email.nil? || user.email != user.previous_email}
validates_presence_of :username, :if => Proc.new {|user| user.previous_username.nil? || user.username != user.previous_username}
validates_uniqueness_of :email, :if => Proc.new {|user| user.previous_email.nil? || user.email != user.previous_email}
validates_uniqueness_of :username, :if => Proc.new {|user| user.previous_username.nil? || user.username != user.previous_username}
def initialize(attributes = {})
super # must allow the active record to initialize!
attributes.each do |name, value|
send("#{name}=", value)
end
end
def self.authenticate_by_email(email, password)
user = find_by_email(email)
if user && user.password_hash == BCrypt::Engine.hash_secret(password, user.password_salt)
user
else
nil
end
end
def self.authenticate_by_username(username, password)
user = find_by_username(username)
if user && user.password_hash == BCrypt::Engine.hash_secret(password, user.password_salt)
user
else
nil
end
end
def encrypt_password
if password.present?
self.password_salt = BCrypt::Engine.generate_salt
self.password_hash = BCrypt::Engine.hash_secret(password, password_salt)
end
end
end
فلاش-إشعار flash[:error] = @user.username
يضع المستخدم الجديد, لذلك أنا لا أفهم لماذا لم يكن المستخدم تحديث في قاعدة البيانات.
البداية ظننت بي set_account_info
-الأسلوب ليس صحيح, ولكن ليس لدي أي فكرة أفضل عن كيفية التحقق من المدخلات.
ثانيا انا غيرت form_for طريقة من الافتراضي(ما بعد) put
ثم patch
, ولكن هذا أيضا لم يساعد.
المحلول
مع القضبان 4 attr_accessible لم يعد يستخدم بدلا لدينا الآن قوية params.ما يعنيه هذا هو أن تحتاج الآن أن أقول تطبيق ما معلمات فإنه يمكن تحديث (القائمة البيضاء).
ويتم كل ذلك في وحدة تحكم الآن, سوف أعطيك مثال على ما أقوم به ومعرفة ما إذا كان يساعدك في السيناريو الخاص بك
class ExampleController < ApplicationController
def create
@object= Object.new(my_params)
if @object.save
redirect_to root_path, notice: 'Object Successfully Created'
else
render action: 'new'
end
end
def update
@object= Object.find(params[:id])
if @object.update_attributes(my_params)
redirect_to root_path, notice: 'Object updated'
else
render action: 'edit'
end
end
private
def my_params
params.require(:object).permit(:id, :title, :overview, :category_id,
nested_attributes: [:id, :gallery_id, :gallery_category_id, :photo, :_destroy])
end
لا تنتمي إلى StackOverflow