Ruby on Rails Circumstantial Controller Action JavaScript响应

时间:2016-05-04 20:04:51

标签: javascript ruby-on-rails ruby ajax

说我有请求:Request。必须由管理员批准或拒绝请求。

我在索引页面上为请求设计了一个带有批准/拒绝按钮的UI。类似于脚手架生成的删除按钮。

我面临的问题是,我希望以不同的方式响应AJAX请求。

我有可能使用的操作update,但update.js.erb中的JavaScript响应是针对形式为/requests/1/edit的编辑页面设计的。

我管理的唯一工作就像它的破坏惯例一样,并创建了一个无用的动作来复制代码。

我已完成的工作添加了update_status动作,该动作有自己的*.js.erb响应,可以在索引页面上执行UI更改等操作。

我觉得我想要做的就是非常标准的用户界面,我喜欢做CRUD动作的想法,但我面对的是墙。

有没有办法在update.js.erb内完成所有操作。我可以发送不同的*.js.erb回复吗?我的解决方法有效,但这是唯一的方法吗?

在此先感谢,我非常感谢您的支持,经验和专业知识!

修改

代码示例:

# app/controllers/requests_controller.rb
class RequestsController < ApplicationController
  before_action :authenticate_admin!
  before_action :set_request

  def update
    # permitted_request_params permits editable request fields
    if @request.update(permitted_request_params)
      # handles success
    else
      # handles failure
    end
  end

  def update_status
    if @request.update(status: params[:status])
      # handles success
    else
      # handles failure
    end
  end

  private
    # more stuff
end

# app/views/requests/update.js.erb
// code to signal that the update was successful or not on /requests/1/edit

# app/views/request/update_status.js.erb
// code that changes the UI to show the request was approved and signal successfully update of status

理想情况下,所有内容都可以在update.js.erb文件中完成,然后我可以移除update_status操作。

编辑2

我已经看到有人做出approvedecline行动的例子。也许这会更好,因为如果你正在建立一个库来连接你的应用程序(例如Stripe,Heroku,Cloudflare等),它会更明确。

request.approve -> PUT /request/1/approve

我并不喜欢我的做法,但是像这样愚蠢的看起来并不太糟糕。

2 个答案:

答案 0 :(得分:0)

听起来你正在试图弄清楚如何编写一个通过几个不同的HTML页面发送的单个Javascript文件。

有几种方法可以做到这一点。

最简单的选择是将文件放在app/assets/javascripts中,并在//= require myfile中写一个application.js行。这将包含在每个HTML响应中。

您可以选择使用javascript_include_tag在每页的基础上包含脚本。

除了在两个不同的页面上加载相同的脚本之外,还有如何实际编写此脚本的问题。它可能必须被重构为更通用(因此它在两个用例中起作用而不是一个)。

答案 1 :(得分:0)

好吧,使用不同的action来更新相同的resourcerequest不是DRY。无论请求来自哪个页面,相同的request对象都会更新。

因此,最好reuse update行动。要确定请求来自哪个页面,您可以name提交按钮。

<%= submit_tag 'Update', name: 'update_status_only' %>
<%= submit_tag 'Update', name: 'update_request' %>

然后在request_controller

def update
  # permitted_request_params permits editable request fields
  if @request.update(permitted_request_params)
    # handles success
  else
    # handles failure
  end

  if params[:update_status_only]
    render 'update_status'
  end
end