2013-07-02 2 views
0

(с использованием 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) 

ответ

0

Мне нужно было указать маршрут для формы. Раньше у меня было это в моем «клиент» форме (reset_password # редактировать с оказанной форме):

= form_for @user do |f| 

Я изменил это на следующее:

= form_for @user, :url => reset_password_path(@user) do |f| 

Затем я также сделал некоторые изменения в контроллер для форма:

def update 
    @user = current_user 
    @user.password = params[:user][:password] 
    @user.password_confirmation = params[:user][:password_confirmation] 
    respond_to do |format| 
     if [email protected]? 
      format.html { redirect_to "/settings", notice: 'Form incomplete' } 
      format.json { render json: @user.errors, status: :unprocessable_entity } 
     elsif @user.save 
      format.html { redirect_to "/index", notice: 'Password successfully changed' } 
      format.json { head :no_content } 
     else 
      format.html { redirect_to "/settings", notice: 'Form incomplete' } 
      format.json { render json: @user.errors, status: :unprocessable_entity } 
     end 
    end 
end 

Та часть, которая мне нужна была respond_to do |format|, остальные лишь некоторые логические изменения, чтобы сделать его лучше работать для моего приложения.

 Смежные вопросы

  • Нет связанных вопросов^_^