如果在设计注册表单中发生注册错误,则重定向到相同的路由轨道4

时间:2016-05-23 09:34:08

标签: forms ruby-on-rails-4 redirect devise error-messages-for

我已自定义设计注册表单以显示在我的自定义页面中。我正在主页上显示我的注册表单。 http://awesomescreenshot.com/0815w1h9b0

我需要在表单顶部显示错误。如果我单击“提交”按钮而不填写字段,则会重定向到“ / users ”页面并显示错误。我需要在我拥有表单的同一页面中显示错误。

application_helper.rb

module ApplicationHelper
  def resource_name
    :user
  end

  def resource_class 
     User 
  end

  def resource
    @resource ||= User.new
  end

  def devise_mapping
    @devise_mapping ||= Devise.mappings[:user]
  end
end

application_controller.rb

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_action :authenticate_user!
before_filter :configure_devise_params, if: :devise_controller?


        def configure_devise_params
         devise_parameter_sanitizer.for(:sign_up) do |u|
          u.permit(:first_name, :last_name, :gender, :dob, :token, :contact_number, :profile_by, :email, :password, :password_confirmation ,:religion_id ,:caste_id ,:sub_caste_id)
            end
         devise_parameter_sanitizer.for(:account_update) do |u|
          u.permit(:first_name, :last_name, :dob, :contact_number, :profile_by, :email, :current_password)
          end   
        end
     # REDIRECT USER TO OUR CUSTOM PATH AFTER LOGIN
        def after_sign_in_path_for(resource)
            root_path
          end
        def after_update_path_for(resource)
          show_profile_path
        end
        # REDIRECT USER TO OUR CUSTOM PATH AFTER LOGOUT
        def after_sign_out_path_for(resource)
            root_path
        end
    end

的routes.rb

Rails.application.routes.draw do 
  devise_for :users
  get '/home'=>'home#index', as: 'home_path'
end
设计视图下的

new.html.erb

    <%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>

                <div class="field">
                    <%= f.hidden_field :token, value: rand(13 ** 13), autofocus: true %>
                </div>

                <div class="field">
                    <%= f.label :First_Name %>
                    <%= f.text_field :first_name, autofocus: true, placeholder: 'Enter First Name' %>
                </div>

                <div class="field">
                    <%= f.label :Last_Name %>
                    <%= f.text_field :last_name, autofocus: true, placeholder: 'Enter Last Name' %>
                </div>

                <div class="field">
                    <%= f.label :date_of_birth %>
                    <%= f.text_field :dob, class: 'datepicker', placeholder: 'Enter Date of Birth' %>
                        <script type="text/javascript">
                        $('.datepicker').datepicker()
                        </script>
                </div>

                <div class="field">
                    <%= f.label :gender %>
                    <%= f.radio_button :gender, '1', :checked => true %> <span class="radio-names">Male</span>
                    <%= f.radio_button :gender, '2' %><span class="radio-names">Female</span>
                </div>

                <div class="field">
                    <%= f.label :email %>
                    <%= f.email_field :email, autofocus: true, placeholder: 'Enter Email Address' %>
                </div>

                <div class="field">
                    <%= f.label :profile_password %>
                    <% if @minimum_password_length %>
                    <em>(<%= @minimum_password_length %> characters minimum)</em>
                    <% end %>
                    <%= f.password_field :password, autocomplete: "off", placeholder: 'Enter Password' %>
                </div>

                <div class="field">
                    <%= f.label :confirm_password %>
                    <%= f.password_field :password_confirmation, autocomplete: "off", placeholder: 'Enter Confirm Password' %>
                </div>

                <div class="field">
                    <%= f.label :register_for %>
                    <%= f.select :profile_by, [['Myself', 1], ['Dad', 2], ['Mom', 3], ['Brother', 4], ['Sister', 5], ['Relative', 6], ['Son', 7], ['Daughter', 8]],{},{class: 'select_tag'} %>
                </div>

                <div class="field">
                    <%= f.label :contact_number %>
                    <%= f.text_field :contact_number, autofocus: true, placeholder: 'Enter Contact Number +91' %>
                </div>


                <div class="field">
                    <%= f.label :Religion %>
                    <%= f.select :religion_id, options_from_collection_for_select(Religion.all, :id, :religion),{},{class: 'select_tag'} %>
                </div>

                <div class="field">
                    <%= f.label :caste %>
                    <%= f.select :caste_id, options_from_collection_for_select(Caste.all, :id, :caste_name),{},{class: 'select_tag'} %>
                </div>

                <div class="field">
                    <%= f.label :subcaste %>
                    <%= f.select :sub_caste_id, options_from_collection_for_select(Subcaste.all, :id, :sub_caste_name),{},{class: 'select_tag'} %>
                </div>

                <br>
                <br>

                <div class="actions">
                    <%= f.submit "Register", class: 'register_button' %>
                </div>
<% end %>

如果在注册过程中发生错误,请帮助我如何在同一页面显示错误。

2 个答案:

答案 0 :(得分:0)

您不需要覆盖设计控制器 试试这个:

在lib文件夹中创建类并覆盖设计失败方法,如下所示:

class CustomFailure < Devise::FailureApp
  def redirect_url
     #new_user_registration_path or your_path
  end

  def respond
    if http_auth?
     http_auth
   else
     redirect
   end
 end
end

并把这个config / initializers / devise.rb

 config.warden do |manager|
    manager.failure_app = CustomFailure
  end

还有一件事需要自动加载lib文件,如:

config.autoload_paths << Rails.root.join('lib')

将此行放在config / application.rb

答案 1 :(得分:0)

获取错误时,它会从http://localhost:3000/users/sign_up移至http://localhost:3000/users with errors并形成。

如果您查看https://github.com/plataformatec/devise/blob/master/app/controllers/devise/registrations_controller.rb

中的控制器

registrations_controller.rb

找到create方法

 def create
    [..................]
       else
         set_flash_message! :notice, :"signed_up_but_#{resource.inactive_message}"
         expire_data_after_sign_in!
         respond_with resource, location: after_inactive_sign_up_path_for(resource)
    [..................]

您可以很容易地看到,当出现错误时,它会响应资源,在您的情况下,它是users

有两个选项

  1. 您可以覆盖注册控制器并在上面的行中添加重定向。
  2. 或者您可以为Devise创建策略。