繁体   English   中英

Ruby on Rails环境控制器操作JavaScript响应

[英]Ruby on Rails Circumstantial Controller Action JavaScript Response

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

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

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

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

我所管理的唯一工作就是感觉像是违反了约定,并且创建了重复代码的无用动作。

我所做的是添加了具有自己的*.js.erb响应的update_status动作,以在索引页面上执行类似UI更改的操作。

我觉得我想要做的是非常标准的UI,并且我喜欢采用CRUD操作的想法,但是我正面临着一堵墙。

update.js.erb有没有办法做到这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

我不是很喜欢我的方法,但是像这样愚蠢的做法似乎还不错。

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

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

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

您也可以使用javascript_include_tag逐页添加脚本。

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

好吧,具有用于更新同一resource不同action s request不是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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM