【问题标题】:Devise error messages missing after custom redirect自定义重定向后设计错误消息丢失
【发布时间】:2026-01-10 10:10:01
【问题描述】:

我为我的设计注册表单设置了自定义重定向,我有两种表单,一种用于个人,另一种用于公司。我在注册控制器的创建操作中添加了这个:

if resource.company_form
    redirect_to new_user_registration_path(company: true)    
  else  
    redirect_to new_user_registration_path
  end

虽然我丢失了所有设计错误消息,但在执行此操作时,因为不显示任何验证错误,所以我需要将错误消息与重定向一起发送,不是吗?但是,我不确定如何。

到目前为止,我已经尝试将错误消息打印到控制台:

ap(resource.errors.full_messages)

[
 [0] "Email can't be blank",
 [1] "Password can't be blank",
 [2] "Company name can't be blank"
]

而这个:

ap(resource.errors)

@messages={:email=>["can't be blank"], :password=>["can't be blank"], :company_name=>["can't be blank"]}

如何让错误消息再次显示在表单上方?

【问题讨论】:

    标签: forms validation ruby-on-rails-4 devise


    【解决方案1】:

    设计错误消息的神奇之处在于使用 respond_with 方法。

    因此您可以更改respond_with 块的redirect_to

    respond_with(resource) do |format|
      if resource.company_form
        format.html { render 'new', locals: { is_organisation: true } }
      else  
        format.html { render 'new' }
      end
    end
    

    在你看来

    <% params[:organisation] ||= is_organisation -%>
    

    【讨论】:

    • 感谢您的回答,但我仍然没有显示任何错误消息
    • 我编辑了答案,可能在redirect_to指令中没有发送flash消息
    • 我不太确定在我看来会怎样抱歉
    • 代替'new',你可以放你的模板路径
    【解决方案2】:

    不确定这是否会有所帮助,但您可以使用您的消息进一步自定义。首先,首先实际确保它有效是一个好主意。然后进一步定制它。

    1. 将您的 toastr gem 添加到您的 gemfile。

    gem 'toastr-rails', '~&gt; 1.0'

    1. 您需要在 application.js 中添加//= require toastr

    2. 在您的 stylesheet.scss 中,您需要导入 toastr @import "toastr";

    3. 然后在终端中运行bundle

    在您的 views/devise/registrations/ 文件夹和 views/devise/password/ 文件夹中,里面的页面是显示错误消息的设计视图。在那里,您将通过设计找到错误消息。 &lt;%= devise_error_messages! %&gt;

    所以你想做的就是自定义这些消息。

    现在转到视图/共享并创建一个新文件并将其命名为_devisemes.html.erb

    <% unless resource.errors.empty? %>
      <script type="text/javascript">
       <% resource.errors.full_messages.each do |value| %>
         toastr.error('<%= value %>')
       <% end %>
      </script>
    <% end %>
    

    保存此文件后。只需转到以下文件并找到

    &lt;%= devise_error_messages! %&gt;

    在以下文件中将其替换为 &lt;%= render 'shared/devisemes' %&gt;

    views/devise/registrations/edit.html.erb

    views/devise/registrations/new.html.erb

    views/devise/password/new.html.erb

    views/devise/password/edit.html.erb

    现在注销并创建一个帐户,无需电子邮件或密码并进行测试。您会注意到所有来自设备的错误消息都显示在 toastr 中。

    【讨论】:

      最近更新 更多