【问题标题】:Getting status: code on ajax response in a .js.erb file on Rails获取状态:Rails 上 .js.erb 文件中的 ajax 响应代码
【发布时间】:2017-05-15 15:33:56
【问题描述】:

我刚刚开始使用 Rails 应用程序,我正在尝试在表单上使用 Ajax,但我不知道如何在 js.erb 文件中捕获状态代码。我正在关注本教程:http://guides.rubyonrails.org/working_with_javascript_in_rails.html

在我的用户控制器上,我有一个更新方法的代码:

respond_to do |format|
        if @user.save
            format.html { redirect_to @user, notice: 'User was successfully created.' }
            format.js {}
            format.json { render json: @user, status: :created, location: @user}
        else 
            format.html { render action: 'edit' }
            format.js {}
            format.json { render json: @user, status: :unprocessable_entity }
            logger.debug @user.response_errors
        end         
    end

我在我的views/users/文件夹中创建了一个update.js.erb 文件,并且很容易调试@user var,但我不知道如何获取在我的方法上设置的状态码。

对不起,如果这是一个愚蠢的问题,但我是 Rails 的新手,我正在努力遵循所有框架概念,我不知道创建对 Ajax 请求的响应的最佳实践。

我想要实现的是这样的:

#on my update.js.erb
if( status == 'created' ) {
   alert( 'Ok, created' )
} else {
   alert( 'Something wrong happened' )
}

感谢您的帮助。

【问题讨论】:

    标签: ruby-on-rails json ruby ajax respond-to


    【解决方案1】:

    我会尝试这样做:

    format.js {render json: {@user, status: :created, location: @user}}

    【讨论】:

    • 感谢您的回答,但不幸的是它抛出了一个语法错误:/.../app/controllers/users_controller.rb:30: syntax error, unexpected ',', expecting => ... format.js {render json: {@user, status: :unprocessable_entit... ... ^
    【解决方案2】:

    选项 1:检查 update.js.erb 内部的有效性

    这是我在大多数情况下推荐的选项。

    update.js.erb 是一个 ERB 模板,其结果是在客户端上评估的 JavaScript 代码。在这种情况下,您可以使其看起来像:

    <% if @user.valid? %>
      alert('Ok, created');
    <% else %>
      alert('Something wrong happened');
    <% end %>
    

    显示哪个警报的决定发生在服务器端。客户收到:

    alert('Ok, create');
    

    alert('Something wrong happened');
    

    取决于@user的状态。

    选项 2:两个单独的 js.erb 文件

    您可以将update.js.erb 拆分为两个文件。 update.js.erb 应该包含快乐路径代码:

    alert('Ok, create');
    

    update-error.js.erb 应该包含一些错误处理:

    alert('Something wrong happened');
    

    然后你决定在你的控制器中显示哪一个:

    respond_to do |format|
      if @user.save
        # ...
        format.js {}
        # ...
      else 
        # ...
        format.js { render 'update-error' }
        # ...
      end         
    end
    

    【讨论】:

    • 感谢您的回答 Greg,第一个选项效果很好,适合我的需要。我唯一的疑问仍然是在我的代码上设置了该状态:format.json { render json: @user, status: :unprocessable_entity } 有理由设置它吗?
    • 是的,我认为用 200 响应是不正确的,而您选择的状态码似乎是正确的。
    猜你喜欢
    • 2014-10-17
    • 2020-08-19
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    • 2020-01-10
    • 1970-01-01
    • 2016-02-07
    • 2017-09-26
    相关资源
    最近更新 更多