У меня есть модель пользователя с атрибутами имени и пароля. Когда пользователь нажимает «Редактировать», я хочу, чтобы только поле имени редактировалось и проверялось, но не поле пароля. И наоборот, когда пользователь нажимает «Сбросить пароль». Я думаю, что моя основная проблема заключается в том, как отключить проверку пароля во время редактирования поля имени и как отключить проверку имени во время редактирования пароля?Как обновить два разных атрибута на двух разных страницах?
edit.html.erb
<%= form_for @user, html: { class: "form_settings" } do |f| %>
<%= render 'shared/error_messages', object: f.object %>
<p><span><%= f.label :name %></span>
<%= f.text_field :name %>
</p>
<p style="padding-top: 15px"><span> </span>
<%= f.submit "Submit", class: "submit" %>
</p>
<% end %>
reset_password.html.erb
<%= form_for @user, html: { class: "form_settings" } do |f| %>
<%= render 'shared/error_messages', object: f.object %>
<p><span><%= label_tag :old_password, "Current Password" %></span>
<%= password_field_tag :old_password %>
</p>
<p><span><%= f.label :password %></span>
<%= f.password_field :password %>
</p>
<p><span><%= f.label :password_confirmation %></span>
<%= f.password_field :password_confirmation %>
</p>
<p style="padding-top: 15px"><span> </span>
<%= f.submit "Submit", class: "submit" %>
</p>
<% end %>
users_controller.rb
def update
@user = User.find(params[:id])
if params[:old_password]
if @user.authenticate(params[:old_password])
@user.update_attributes(password: params[:user][:password])
flash[:success] = "Password has been updated"
redirect_to @user
else
flash.now[:error] = "Current password is incorrect"
render :reset_password
end
elsif @user.update_attributes(params[:user])
flash[:success] = "User name updated"
redirect_to @user
else
render :edit
end
end
Моя другая проблема заключается в том, что проверка пароля и пароля_подтверждения не работает. Это то, что я имею в модели:
validates :password, presence: true, confirmation: true
UPDATE Есть пароль для сброса и проверки работы с этим кодом:
def update
@user = User.find(params[:id])
if params[:old_password]
if @user.authenticate(params[:old_password])
if params[:user][:password] == params[:user][:password_confirmation]
@user.update_attributes(password: params[:user][:password])
flash[:success] = "Password has been updated"
redirect_to @user
else
flash.now[:error] = "Passwords don't match"
render :reset_password
end
else
flash.now[:error] = "Current password is incorrect"
render :reset_password
end
elsif @user.update_attributes(params[:user])
flash[:success] = "User name updated"
redirect_to @user
else
render :edit
end
end
Но это кажется слишком сложным для меня. Кто-нибудь видит более легкое решение?
Но у меня все еще есть проблема с редактированием поля имени. Он говорит, что пароль не может быть пустым.
По какой-то причине действие обновления вызывается, когда я пытаюсь сбросить пароль, как это. – mikeglaz
Вы используете форму? Вы должны указать каждую кнопку на другое действие. – Intrepidd
Да, вот и все. Не знал, что вы можете применить действие в form_for. Я, наконец, в такой момент, когда я понимаю ответы программистов Rails. благодаря – mikeglaz