Rails服务器返回500内部服务器错误,但仍然发布到数据库

时间:2017-04-21 02:35:31

标签: javascript html ruby-on-rails ajax error-handling

虽然我已经在几天内倾注了类似的问题,但我还没找到任何有帮助的东西。我一定不能理解正确的事情。我试图修改Michael Hartl的教程,在rails 5 app中使用模态和ajax。一切顺利,直到我尝试通过发送的电子邮件链接重置密码,并且我不确定我是否做错了什么或者它是否与gmail / sendgrid包装器有关。

我通过用js.erb替换每个适当的动作的html.erb文件打开模态,然后使用jquery通过partials渲染模态体中的表单。适用于除重置链接之外的所有内容。但是,在重置链接的情况下,它不会触发edit.js.erb动作,我假设(可能不正确),因为链接正在寻找html并且可以'由于潜在的安全问题而被修改(并且正确地)。单击重置链接时,结果无法打开包含密码重置表单的模式。我可以解决这个问题的唯一方法是将我的jquery放在edit.html.erb文件中并将其包装在脚本标记中。

一旦我能够在单击重置链接时打开模式,表单就会显示,表单提交错误会在适当时显示,并且新密码数据会按预期发布到数据库但是......我&#39 ; m从服务器获得500错误,没有任何重定向。根据头部,请求是用ajax生成的,将接受json,响应头部显示json作为内容类型。是的,我是一个新手,所以我可能会错过一些清楚的伏特加作为那里的人,所以请提前道歉。任何帮助,将不胜感激。谢谢。

password_resets_controller.rb

 def update
      respond_to do |format|
        if params[:user][:password].empty?
          @user.errors.add(:password, "can\'t be empty")
          format.json { render json: @user.errors.full_messages, status: :unprocessable_entity }
        elsif @user.update_attributes(user_params)
          format.json { head :no_content }
          format.js 
          log_in @user
          @user.update_attribute(:rest_digest, nil)
          flash[:info] = "Your password has been updated."
          redirect_to @user
        else
          format.json { render json: @user.errors.full_messages, status: :unprocessable_entity }
        end
      end
    end

_edit.form.html

<%= form_for(@user, url: password_reset_path(params[:id]), data: { type: :json } , remote: true, id: "pw-reset-form") do |f| %>  

        <div class="alert info-<%= message_type %>"><%= message %>      
        </div>

      <%= hidden_field_tag :email, @user.email %>    
      <%= f.label :password %>
      <%= f.password_field :password, placeholder: 'Password', class: 'form-control' %>

      <%= f.label :password_confirmation, "Confirmation" %>
      <%= f.password_field :password_confirmation, placeholder: 'Password', class: 'form-control' %>

      <%= f.submit "Update Your Password", class: "btn btn-primary", remote: true  %>
    <% end %>

edit.html.erb

<script type="text/javascript">
$('#dialog h3').html("<i class='glyphicon glyphicon-plus'></i> Password Reset");
$('.modal-body').html('<%= j render("password_resets/edit_form") %>');
$('#dialog').modal("show");
$('#dialog').on('shown.bs.modal', function () {
      $('.first_input').focus()
  })
</script>

user_mailer文件/ password_reset.html.erb

<%= link_to "Reset Password", edit_password_reset_url(@user.reset_token, email: @user.email)%>

路线

 password_resets POST   /password_resets(.:format)              password_resets#create
     new_password_reset GET    /password_resets/new(.:format)          password_resets#new
    edit_password_reset GET    /password_resets/:id/edit(.:format)     password_resets#edit
         password_reset PATCH  /password_resets/:id(.:format)          password_resets#update
                        PUT    /password_resets/:id(.:format)          password_resets#update

请求标题

Host: xxxxxxxxx.herokuapp.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://xxxxxxxxx.herokuapp.com/password_resets/WZX92Z-z9OI7EhwWxSfbSg/edit?email=xxxxxx%40gmail.com
X-CSRF-Token: PkTwBobw+9x2y83hLS+QSz8AUhthAYDdUCYjXnryDQ5Ecbr9bDgAmFQ57TtOxHx6/iwerZDX1WLdgxhKP09vw==
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
x-requested-with: XMLHttpRequest
Content-Length: 150
Cache-Control: no-cache

响应标题

Connection: keep-alive
Content-Length: 46
Content-Type: application/json; charset=utf-8
Date: Fri, 21 Apr 2017 02:11:49 GMT
Server: Cowboy
Strict-Transport-Security: max-age=15552000; includeSubDomains
Via: 1.1 vegur
x-request-id: 7b6cbb63-7d7b-4e14-9612-079633ba014f
x-runtime: 0.187740

1 个答案:

答案 0 :(得分:0)

我发现解决方案非常简单。我没有让用户在登录控制器中成为实例变量。将登录用户更改为登录@user修复了问题,我觉得自己错过了它。我设法学习了很多关于COR,HTTP和浏览器开发工具的知识,所以这并不是一个完全的损失,但最重要的是在生产环境中将“config.consider_all_requests_local”设置为true。一旦我看到堆栈跟踪,就会立即发现问题。在项目上线之前我一定会把它设置为假,但是,男人,希望我几天前能够偶然发现这个想法。哦,生活和学习。感谢任何可能已经考虑修复这样一个菜鸟错误的人!