(с использованием Rails 3) У меня есть authlogic, настроенный для управления моими пользователями и пользовательскими сеансами (с контроллером пользователя и контроллером user_sessions и соответствующими представлениями, моделями и т. Д.). У меня два уровня пользователя: администратор и клиент. Администратор может создавать пользователей и редактировать пользователей, а пользователи могут просматривать документы на веб-сайте (никаких прав пользователя или прав на просмотр вообще).Недопустимый ввод формы приводит к отказу Authlogic к другой форме
Затем я реализовал другой контроллер (reset_password), который позволяет клиентам сменить свой пароль на веб-сайте. Для этого я разрешил клиентам редактировать клиентов (чтобы они могли редактировать сами). Но форма, которая позволяет клиентам менять свой пароль, гораздо более ограничена, чем форма, позволяющая администраторам создавать клиентов.
Проблема, с которой я столкнулась, заключается в том, что когда клиент переходит к форме редактирования пароля и вводит неверный пароль или подтверждение пароля, страница обновляется до полной формы администратора, которая позволяет клиентам изменять свои привилегии и т. Д. Что мне нужно это способ заставить неудачную запись формы вернуть клиента в ту же форму, что и они, а не в форме администратора.
Проблема, я уверен, состоит в том, что и форма администратора, и клиентская форма используют форму form_for @user do | f | для определения формы. Я считаю, что рельсы не могут рассказать обо всем.
Вот соответствующие файлы:
Мои админы форма (пользователи # редактировать с оказанной формой):
= stylesheet_link_tag :universal
= form_for @user do |f|
- if @user.errors.any?
#error_explanation
%span.boldHeader= "#{pluralize(@user.errors.count, "error")} prohibited this user from being saved:"
%ul
- @user.errors.full_messages.each do |msg|
%li= msg
.fieldContainer
.field
= f.label :username
= f.text_field :username
.field
= f.label :role
= f.collection_select :role, User::ROLES, :to_s, :humanize, { :selected => :client }
.fieldContainer
.field
= f.label :password
= f.password_field :password
.field
= f.label :password_confirmation
= f.password_field :password_confirmation
.fieldContainer
.field
= f.label :first_name
= f.text_field :first_name
.field
= f.label :last_name
= f.text_field :last_name
.field
= f.label :firm_name
= f.text_field :firm_name
.fieldContainer
.field
= f.label :email
= f.text_field :email
.field
= f.label :phone
= f.text_field :phone
.actions
= f.submit 'Save'
%a.button{ :href => "/users" }Cancel
Моего клиентом форма (reset_password # редактировать с оказанной формой):
= stylesheet_link_tag :universal
= form_for @user do |f|
- if @user.errors.any?
#error_explanation
%span.boldHeader= "#{pluralize(@user.errors.count, "error")} prohibited this user from being saved:"
%ul
- @user.errors.full_messages.each do |msg|
%li= msg
.fieldContainer
.field
= f.label :password
= f.password_field :password
.field
= f.label :password_confirmation
= f.password_field :password_confirmation
.actions
= f.submit 'Save'
%a.button{ :href => "/users" }Cancel
Метод изменения формы клиента:
def update
@user = current_user
if @user.update_attributes(params[:user])
format.html { redirect_to @user, notice: 'Password successfully changed.' }
format.json { head :no_content }
else
format.json { render json: @user.errors, status: :unprocessable_entity }
format.html { redirect_to "/settings" }
end
end
Администратор метод Форма обновления:
def update
respond_to do |format|
if @user.update_attributes(params[:user])
format.html { redirect_to @user, notice: 'User was successfully updated' }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
end
Примечание:/настройки маршрутов reset_passwords # редактирования, который имеет частичный визуализации в нем, который, как я отобразить форму клиента (см. Выше) У меня также есть пользователи, user_sessions и reset_passwords как ресурсы в файле маршрутов.
Наконец, вот что я вижу в журнале производства. Вы можете видеть, что я начинаю с reset_password/_form (клиентская форма), но затем я возвращаюсь к пользователям/_form (форма администратора).
Started GET "/settings" for 127.0.0.1 at 2013-07-02 16:26:52 -0400
Processing by ResetPasswordsController#edit as HTML
User Load (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
Rendered reset_passwords/_form.html.haml (4.0ms)
Rendered reset_passwords/edit.html.haml within layouts/application (14.0ms)
Rendered shared/_header.html.haml (1.0ms)
Completed 200 OK in 57ms (Views: 54.0ms | ActiveRecord: 0.0ms)
[2013-07-02 16:26:52] WARN Could not determine content-length of response body. Set content-length of the response or set Response#chunked = true
Started GET "/assets/global.css?body=1" for 127.0.0.1 at 2013-07-02 16:26:52 -0400
Served asset /global.css - 304 Not Modified (0ms)
[2013-07-02 16:26:53] WARN Could not determine content-length of response body. Set content-length of the response or set Response#chunked = true
Started PUT "https://stackoverflow.com/users/1" for 127.0.0.1 at 2013-07-02 16:26:58 -0400
Processing by UsersController#update as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"9KeHrOySL3FRhSnfYtVvKl2rCz9EPBSyGmtGGasDxnA=", "user"=>{"password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"Save", "id"=>"1"}
User Load (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", "1"]]
User Load (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
(0.0ms) begin transaction
User Exists (0.0ms) SELECT 1 AS one FROM "users" WHERE ("users"."persistence_token" = '5d1007bf94b34a7de44707e4ca432b18338f1c9ef6c5f99bf04845096a6b880057b5b43c917b9d38f790521ef62147eec3d9302471da73967048b48b4a399b18' AND "users"."id" != 1) LIMIT 1
(1.0ms) rollback transaction
Rendered users/_form.html.haml (9.0ms)
Rendered users/edit.html.haml within layouts/application (19.0ms)
Rendered shared/_header.html.haml (0.0ms)
Completed 200 OK in 80ms (Views: 61.0ms | ActiveRecord: 1.0ms)