我一直在审查让重定向工作的所有解决方案。我去覆盖注册控制器和重定向工作,但我不知道在哪里得到简单的形式来处理错误。如果我通过标准路由到设计视图,它会显示正确的错误和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
答案 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
我没有测试过,但我相信它可能会按你的需要进行测试。