说我有请求: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
操作。
我已经看到有人做出approve
和decline
行动的例子。也许这会更好,因为如果你正在建立一个库来连接你的应用程序(例如Stripe,Heroku,Cloudflare等),它会更明确。
request.approve -> PUT /request/1/approve
我并不喜欢我的做法,但是像这样愚蠢的看起来并不太糟糕。
答案 0 :(得分:0)
听起来你正在试图弄清楚如何编写一个通过几个不同的HTML页面发送的单个Javascript文件。
有几种方法可以做到这一点。
最简单的选择是将文件放在app/assets/javascripts
中,并在//= require myfile
中写一个application.js
行。这将包含在每个HTML响应中。
您可以选择使用javascript_include_tag在每页的基础上包含脚本。
除了在两个不同的页面上加载相同的脚本之外,还有如何实际编写此脚本的问题。它可能必须被重构为更通用(因此它在两个用例中起作用而不是一个)。
答案 1 :(得分:0)
好吧,使用不同的action
来更新相同的resource
说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