2014-06-11 39 views
3

我想弄清楚如何使用简单的窗体与Rails,Devise,Omniauth和Bootstrap。我有几个问题,但其中之一是错误通知。简单的窗体错误通知

我有一个设计登录和注册形式内Bootstrap模态。登记表如下。请注意,我从表格中删除了required: true函数,因为我不喜欢将星号附加到标签上(但我确实尝试将其返回以查看错误通知是否可用)。

<% if user_signed_in? %> 
    <li> 
    <%= link_to('Edit registration', edit_user_registration_path) %> 
    </li> 
<% else %> 
    <li> 
    <%= link_to 'Register', new_user_registration_path, :remote => true, 'data-toggle' => "modal", 'data-target' => "#myRModal", :method => 'get' %> 
    </li> 

    <div class="modal fade" id="myRModal" tabindex="-1" role="dialog" aria-labelledby="myRModalLabel" aria-hidden="true"> 
    <div class="modal-dialog"> 
     <div class="modal-content"> 
     <div class="modal-header"> 
      <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button> 
      <h4 class="modal-title" id="myModalLabel" style="color:black">Register</h4> 
     </div> 

     <div class="modal-body"> 
      <%- if devise_mapping.omniauthable? %> 
      <div class="facebookauth"> <%= link_to "Register with Facebook", user_omniauth_authorize_path(:facebook) %></div> 
      <br /> 
      <% end -%> 
      <%- if devise_mapping.omniauthable? %> 
      <div class="linkedinauth"> <%= link_to "Register with LinkedIn", user_omniauth_authorize_path(:linkedin) %></div> 
      <br /> 
      <% end -%> 
     </div> 

     <div class="modal-footer"> 



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

    <div class="form-inputs" style="padding-left:20%; text-align:left; color:black;"> 

     <%= f.input :first_name, placeholder: 'Enter your first name', autofocus: true, :input_html => {:maxlength => 15, :size => 40} %> 
     <%= f.input :last_name, placeholder: 'Enter your surname', autofocus: true, :input_html => {:maxlength => 15, :size => 40} %> 
     <%= f.input :email, placeholder: 'Enter email', autofocus: true, :input_html => {:maxlength => 25, :size => 40} %> 
     <%= f.input :password, placeholder: 'At least 8 characters', :input_html => {:maxlength => 15, :size => 40} %> 
     <%= f.input :password_confirmation, placeholder: 'Confirm your password', :input_html => {:maxlength => 15, :size => 40} %> 
    </div> 

    <div class="form-actions" style="padding-left:20%; padding-top:5%; text-align:left; color:black;"> 
     <%= f.button :submit, "Register" %><% end %> 

我有一个用户模式验证电子邮件地址和密码的存在。

我有以下命令来创建功能的用户/ registration_controller:

def create 
    @user = User.new(user_params)#(params[:user]) 

    respond_to do |format| 
    if @user.save 
     # Tell the UserMailer to send a welcome email after save 
     # AdminMailer.new_user_waiting_for_approval.deliver 

     format.html { redirect_to(root_path, notice: 'Registration received.') } 
     format.json { render json: root_path, status: :created, location: @user } 
    else 
     format.html { redirect_to(root_path, alert: 'Sorry! There was a problem with your registration. Please contact us to sort it out.') } 
     # format.html { render action: 'new' } 
     format.json { render json: @user.errors, status: :unprocessable_entity } 
    end 
    end 
end 

我有设计在我的两个应用助手的助手,并制定帮手如下:

def resource_name 
    :user 
end 

def resource 
    @resource ||= User.new 
end 

def devise_mapping 
    @devise_mapping ||= Devise.mappings[:user] 
end 

我的初始化文件有两个简单的表单文件。一个是simple_form.rb。另一种是simple_form_bootstrap.rb

没有错误在窗体中内联显示。当我填写没有电子邮件地址的表单时,出现我的registration_controller的create函数中出现的错误。

当用户点击提交时,我真的很希望在表单中以内联方式显示错误。

有谁知道如何解决这个问题?

谢谢。

+0

是通过AJAX提交的表单吗? – Sharagoz

回答

2

请确保您有在乌拉圭回合初始的包装

b.use :error, wrap_with: { tag: 'span', class: 'help-block' }

如您在乌尔问题中提到类似的线,请删除required: false, 并要求删除“*”,改变它在配置/ locale/simple_form.en.yml

required: 
    text: 'required' 
    mark: '' 
+0

谢谢。我写了自定义jquery来处理错误(所以没有试图编辑简单的形式或简单的形式引导初始化与上述建议。我真的不明白为什么标准函数不与这些宝石,但工作围绕这个问题。谢谢关于*在yml文件中的提示。 – Mel

2

有谁知道如何解决这个问题?

因为您可以使用registration表单中的对象,这意味着您对如何显示错误有一些自由。这将是一个不同的故事,如果你试图达到同样的用login(如登录不使用的一种形式)

-

我们以前(你这样做可以看到here - 点击“注册”,在顶部):

#app/views/devise/registrations/new.html.erb 
<%= f.email_field :email, :placeholder => "email" %> 
<div class="error"><%= devise_resource.errors[:email].first if devise_resource.errors[:email].present? %></div> 

考虑形式在form_for对象使用devise_resource - 这应该让你牛逼o显示错误内联

+0

嗨Rich,谢谢你向我展示你的例子。我认为我原来的帖子出了问题。注册表格的开头没有出现在我的问题的公开文本中。我正在使用简单形式的宝石。它有一个f.error_notification函数。我想知道是否干扰了错误通知。我尝试添加类似于你的代码到我的表单中,但它不起作用。我想知道是否有简单表单中的某些内容对此问题有所贡献。感谢您分享您的方法 - 如果我无法解决这个问题,也许我可以卸载简单表单并按照您的方式尝试。 – Mel

1

你说你在使用模态?但是你不会发布阿贾克斯(你的表单上没有remote: true)。所以我会描述我现在想要发生的事情。您不发布Ajax,因此您发布html,因此它选择format.html路径,错误时您的控制器重定向到根路径,并显示错误消息。相反,它应该重新呈现表单。

因此,取消注释创建操作中的注释行应该工作:)(并且显然删除当前的format.html行)。

Ofcourse重新渲染不会是一个模式。在使用模态时,如果您希望表单保持打开状态,则必须使用ajax,并在发生错误时将表单替换为重新呈现的版本。

简单的形式,给出的验证,错误的对象时,会自动显示错误的内联。

+0

感谢您关注此事。我已经更新了这个问题,以包含模态的开始行(显示远程真实)。我需要在表单中再次使用它吗?我不知道如何用重新呈现的表单替换表单。你知道怎么做吗?即使在删除并重新安装设计和简单形式之后 - 错误也不会在表单中显示为内联。我真的很想了解如何让他们展示。你是否知道为什么他们不能渲染,内联,几乎每个博客和文档都与简单的表单和设计相关联?谢谢 – Mel

+0

让我明白这一点:当你点击“注册”链接时,你会显示模式,它包含两个链接,用Facebook或LinkedIn注册? Afaik的'data-toggle'会阻止跟随链接的默认动作,所以你只能看到两个链接。那是对的吗? – nathanvda

+0

看来你在同一时间处理很多:设计和简单形式是新的,Ajax形式是新的,可能甚至轨道是你的新手,然后你想要做omniauth。我会专注于准备好简单的注册流程,并逐渐使其变得更加困难,以便您可以逐步完成。婴儿的步骤。 – nathanvda

1

,错误验证的问题得到解决,如果:

  1. 删除:从simple_form通话f.error_nofication;和
  2. 插入:<%= devise_error_messages! %>在表单输入字段中。

如果您对用户模型进行了验证并且还使用了devise validatable,则表单顶部的错误列表将复制错误。删除一个或另一个验证,你将会有错误的工作。

我想不通为什么简单的形式不渲染错误 - 但这是一个解决方案。

我决定从我的应用程序中删除简单的形式 - 我不能阅读张贴在堆栈溢出有关使用它与色器件没有得到回答的文档和这么多问题。我看不到它的好处。

至于模态 - 我会用这个来试试。 (手指交叉)。我希望这个答案有助于某人。我一直在设法设计3个月 - 用3周的时间努力了解文档。