[英]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
操作。
我看过一个有人approve
和decline
行动的示例。 也许这样做会更好,因为如果您要创建一个库来连接应用程序(例如,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.