我有一个登录表单,在用户点击链接后弹出对话框。在该表单中,我有两个用户名/密码字段。如果用户成功登录,则会将其重定向到他的个人资料页面。问题是如果用户没有正确登录。我想在同一个对话框中显示一些消息而不关闭该对话框。
这是我的对话:
<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"
因此,如果用户输入错误的用户名/密码并在表单上方显示短消息,我只想保留弹出对话窗口。实现这一目标的最佳方法是什么?谢谢:))
答案 0 :(得分:0)
你有两(3?)个问题:
<强>零:NilClass 强>
nil的未定义方法`errors':NilClass
我猜测这个错误是由你传递/调用表单对象错误引起的
您目前正在通过object: f.object
,我会这样做:
<%= render 'errors/login', object: f, as: "form" %>
这将传递表单构建器对象并在部分中将其命名为“form”。然后,您就可以像这样调用表单对象:
#app/views/errors/login.html.erb
<%= form.errors.each do |error| %>
//errors
<% end %>
<强>模板强>
缺少模板会话/创建,应用程序/创建 {:locale =&gt; [:en],:formats =&gt; [:html],:handlers =&gt; [:erb,:builder,:raw, :ruby,:jbuilder,:coffee]}。搜索范围:* “/用户/用户名/应用/ AppName的/应用/视图”
这意味着你正在调用一个不存在的文件
具体来说,您需要在此处输入文件:
#app/views/errors/login.html.erb
<%= your_code_here %>
<强>不成功强>
导致出现对话更像是一个JS问题而不是HTML / Rails
我当然会考虑渲染.js.erb
,因为这样可以动态加载页面上的对话元素