【问题标题】:Display error message inside dialog after unsuccessful form submission表单提交失败后在对话框内显示错误消息
【发布时间】:2014-02-15 19:25:17
【问题描述】:

我有一个登录表单,在用户单击链接后会在对话框中弹出。在该表单中,我有两个用户名/密码字段。如果用户成功登录,它会将他重定向到他的个人资料页面。问题是如果用户没有正确登录。我想在同一个对话框中向他显示​​一些消息,而不是关闭该对话框。

这是我的对话:

<div id="login" >
    <div>
        <%= form_for(:session, url: sessions_path) do |f| %>

        <%= f.label :username %>
        <%= f.text_field :username %>

        <%= f.label :password %>
        <%= f.password_field :password %>

        <%= f.submit "Sign in", class: "btn" %>
        <% end %>
    </div>
</div>

这是我的会话控制器:

def create
    user = User.find_by(username: params[:session][:username])
        if user && user.authenticate(params[:session][:password])
            sign_in user
            redirect_back_or(user)
        else
            flash.now[:error] = 'Error!'
            render 'new'
        end
end

因此,您可以看到当前在登录失败后,用户被重定向到登录页面上的新表单,他可以尝试再次登录。我渲染的错误信息通常显示在那里:

<%= render 'errors/login', object: f.object %>

如果我将该消息放在对话框中,打开站点后会立即显示以下错误:

undefined method `errors' for nil:NilClass

可能是因为会话仍然“不可见”。如果我从 SessionsController 删除 render 'new' 登录失败,我会收到以下错误:

Missing template sessions/create, application/create with {:locale=>[:en], :formats=>[:html], :handlers=>[:erb, :builder, :raw, :ruby, :jbuilder, :coffee]}. Searched in: * "/Users/username/Applications/AppName/app/views"

所以,我只想在用户输入错误的用户名/密码时保留弹出对话框窗口并在表单上方显示短消息。实现这一目标的最佳方法是什么?谢谢:)

【问题讨论】:

  • 必须有一个目录error和一个文件login,错误处理表单所在的位置。

标签: javascript jquery ruby-on-rails ruby-on-rails-3


【解决方案1】:

您有 2 (3?) 个问题:


nil:NilClass

nil:NilClass 的未定义方法“错误”

我推测此错误是由于您错误地传递/调用表单对象引起的

你目前正在传递object: f.object,我会这样做:

<%= render 'errors/login', object: f, as: "form" %>

这将传递表单构建器对象并在部分中将其称为“表单”。然后你就可以像这样调用表单对象了:

#app/views/errors/login.html.erb
<%= form.errors.each do |error| %>
   //errors
<% end %>

模板

缺少模板会话/创建、应用程序/创建与 {:locale=>[:en], :formats=>[:html], :handlers=>[:erb, :builder, :raw, :ruby, :jbuilder, :coffee]}。搜索:* "/Users/username/Applications/AppName/app/views"

这意味着你正在调用一个不存在的文件

具体来说,您需要在这里有一个文件:

#app/views/errors/login.html.erb
<%= your_code_here %>

不成功

导致出现对话更多的是 JS 问题,而不是 HTML / Rails 问题

我当然会考虑渲染.js.erb,因为这将允许您在页面上动态加载对话元素

【讨论】:

  • 我有一个类似的问题(相同的控制器代码)。他从未回答过这个问题,但我想知道你是否愿意看看我的——*.com/questions/39357913/…