使用simple_form设计重定向并在失败时显示错误消息

时间:2015-03-13 01:01:50

标签: ruby-on-rails ruby redirect devise ruby-on-rails-4.2

我一直在审查让重定向工作的所有解决方案。我去覆盖注册控制器和重定向工作,但我不知道在哪里得到简单的形式来处理错误。如果我通过标准路由到设计视图,它会显示正确的错误和css,但是,当我在重定向到我的root_path(页面#index)路由时,我看不到任何内容和表单没有改变。

表格代码:

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

    <%= f.error_notification %>

    <div class="form-group top">
      <%= f.input :name, required: true, placeholder: "George Washington" %>
    </div>
    <div class="form-group">
      <%= f.input :email, required: true, placeholder: "Your.email.address@email.com" %>
    </div>
    <div class="form-group">
      <%= f.input :password, required: true, hint: "7 characters minimum. No emojis allowed." %>
    </div>
    <div class="form-group">
      <%= f.input :password_confirmation, required: true %>
    </div>

    <div class="form-actions">
      <%= f.button :submit, "Sign me up and get me my key", class: "btn btn-wide thirdy" %>
      <small class="note">By submitting your information you are agreeing to our Terms & Conditions.</small>
    </div>

  <% end %>

routes.rb中:

Rails.application.routes.draw do
  devise_for :users, controllers: {
    registrations: "registrations"
  }

  get 'pages/index'
  get 'docs', to: 'pages#docs', as: 'docs'

  root to: 'pages#index'
end

registrations_controller.rb

def create
    build_resource(sign_up_params)

    resource.save
    yield resource if block_given?
    if resource.persisted?
      if resource.active_for_authentication?
        set_flash_message :notice, :signed_up if is_flashing_format?
        sign_up(resource_name, resource)
        respond_with resource, location: after_sign_up_path_for(resource)
      else
        set_flash_message :notice, :"signed_up_but_#{resource.inactive_message}" if is_flashing_format?
        expire_data_after_sign_in!
        respond_with resource, location: after_inactive_sign_up_path_for(resource)
      end
    else
      clean_up_passwords resource
      redirect_to root_path
    end
  end

pages_controller.rb

class PagesController < ApplicationController
  def index
  end

  def docs
  end
end

1 个答案:

答案 0 :(得分:2)

当您重定向时,您实际上清理了帖子正文 - 因此您没有任何可用的信息可供处理。所以你不会看到任何错误 - 这是有道理的。

我通常做的是再次渲染局部/视图。请看以下示例:

def new
  @user = User.new
end

def create
  if @user.save
    redirect_to @user
  else
    # You have `params` with all the form data here
    # and also `@user.errors` with data from the validations
    render :new
  end
end

使用render :new,我将再次呈现表单,显示错误。

我相信你需要在那里做类似的事情以显示错误。

但是,我不建议像这样覆盖创建动作 - 我会将RegistrationsController更新为:

class RegistrationsController < Devise::RegistrationsController
  private

  def after_sign_up_path_for(resource)
    root_path
  end
end

Devise使用模板模式允许您在注册过程后更改目标。

如果您希望显示其他view以防其失败 - 例如page/index,则必须在create.html.erb内创建包含该内容的registrations模板文件} template folder。

您的问题的解决方法

为了让它呈现你的page/index以防注册失败,我会将该代码提取到部分内容,并在ApplicationController中为帮助者提取所有你需要做的事情来呈现页。

所以,如果您有index这样的动作(在那里加载了一些内容):

def index
  @recent_news = News.recent_news
  @recent_users = User.recent_users
  @tags = Tag.ordered_by_number
end

我会将其内容提取为:

class ApplicationController < ActionController::Base
  def load_recent_content_and_tags # probably a better naming here
    @recent_news = News.recent_news
    @recent_users = User.recent_users
    @tags = Tag.ordered_by_number
  end
end

PagesController#index就像:

def index
  load_recent_content_and_tags
end

然后,在RegistrationsController

class RegistrationsController < Devise::RegistrationsController

  def create
    super do |resource|
      if resource.errors.present?
        load_recent_content_and_tags
        render 'pages/index' and return
      end
    end
  end 

  private

  def after_sign_up_path_for(resource)
    root_path
  end
end

我没有测试过,但我相信它可能会按你的需要进行测试。