RubyonRails环境控制器操作JavaScript响应

Ruby on Rails Circumstantial Controller Action JavaScript Response

本文关键字:JavaScript 响应 操作 控制器 环境 RubyonRails      更新时间:2023-09-26

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

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

我面临的问题是,我想根据AJAX请求来自的页面,以不同的方式响应它。

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

我处理过的唯一一个工作感觉像是打破了惯例,并创建了一个重复代码的无用操作。

我所做的是添加动作update_status,它有自己的*.js.erb响应来做一些类似于索引页上的UI更改的事情。

我觉得我想做的是非常标准的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

我真的不喜欢我的方法,但像这样沉默似乎也不算太糟糕。

好吧,有不同的action来更新相同的resource,那么request不是DRY。无论请求来自哪个页面,都会更新相同的特定request对象。

因此,reuse的作用优于update。要确定请求来自哪个页面,可以给name以提交按钮。

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

则在CCD_ 21 中

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

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

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

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

您也可以使用javascript_include_tag在每页的基础上包含一个脚本。

除了在两个不同的页面上加载相同的脚本外,还有一个问题是如何实际编写这个脚本。它可能需要进行重构,使其更通用(这样它就可以在两个用例中工作,而不是在一个用例中)。