我的application.js中有一个AJAX调用,它将3个数据发送到我的events_controller #check动作:
//application.js
$(document).on('click', "#check-button", function(){
...
$.ajax({
url: '/events/check',
data: {checkList: checkList , selected_date: selectedDate , length: length },
}
);
});
我的检查行动:
#events_controller.rb
def check
checkList = params[:checkList]
selected_date = params[:selected_date]
length = params[:length]
busy_array = Array.new #this needs to be rendered in the view
...
busy_array.push(user.id) #busy_array is a list of user ids from database
end
#routes.rb
resources :events do
get :check, on: :collection
end
观点:
<button id="check-button" type="button">Check</button>
<div class = "col-md-6" id="unavailable">
<h2>Unavailable on this day:</h2>
<ol id="unavailable-list">
<li>THIS LIST SHOULD BE POPULATED BY BUSY_ARRAY</li>
</ol>
</div>
现在我需要将events_controller#check
的数据发送回视图,但我不知道如何发送busy_array
以便在events\new.html.erb
中呈现
感谢您的帮助,我是一名红宝石/ JS初学者
答案 0 :(得分:1)
busy_array = Array.new #this needs to be rendered in the view
如果必须在视图中提供,则需要定义@instance
变量:
def check
checkList = params[:checkList]
selected_date = params[:selected_date]
length = params[:length]
@busy_array = Array.new
...
@busy_array.push(user.id) #busy_array is a list of user ids from database
end
每次拨打controller#action
时,{/ 1}}中的数据/变量都会被local scope约束。
输出action
中的数据要求变量在整个类的实例中可用(不只是动作/函数)。因此view
。
@busy_array
我不知道如何发送
中呈现#app/views/events/.... <%= button_to "Check", events_check_path %> <div class = "col-md-6" id="unavailable"> <h2>Unavailable on this day:</h2> <ol id="unavailable-list"> </ol> </div> #app/assets/javascripts/application.js $(document).on('click', "#check-button", function(e){ ... $.get('/events/check', {checkList: checkList , selected_date: selectedDate , length: length}); }); #app/controllers/events_controller.rb class EventsController < ApplicationController def check @busy_array = User.joins(:event).where(event: { ... }).pluck(:id) #-> return user ids where event.x = y respond_to do |format| format.js #-> invokes app/views/events/check.js.erb format.html #-> invoked when HTML request sent end end end #app/views/events/check.js.erb <% @busy_array.each do |id| %> $("ol#unavailable-list").append("<%=j id %>") <% end %>
以在busy_array
如果events\new.html.erb
变量为<{1}},则变量将在new
中可用:
@instance
#app/views/events/new.html.erb
<%= @busy_array %>
是view
类实例的一部分,但不在EventsController
方法的范围内。当您向Rails发送请求时,它使用check
的实例编译一组HTML以返回到您的浏览器。
例如,您可以将Controller
流量总结为:
EventsController
如果您手动设置Request > Routing > EventsController.new(request).action > Returned HTML
,则会有以下内容:
EventsController.new(request)
如果您阅读MVC
:
答案 1 :(得分:0)
对于Ruby on Rails中的真实AJAX请求,您需要以JS格式发送检查操作的响应。
<强> events_controller.rb 强>
def check
checkList = params[:checkList]
selected_date = params[:selected_date]
length = params[:length]
@events = Event.where("checklist = ? and date = ?, checkList, selected_date).limit(length.to_i)
...
respond_to do |format|
format.js
end
end
现在,在您看来,而不是check.html.erb,您将拥有check.js.erb。在这个Javascript文件中,您可以访问@变量并渲染部分或任何地方。
<强> check.js.erb 强>
$("#unavailable-list").append('<%= escape_javascript( render :partial => "events/event", :collection => @events ) %>');
<强> _event.html.erb 强>
<li><%= event.name %></li>
我为events数组更改了busy_array,因为我不知道busy_array到底是什么,但你可以更改它。
这是AJAX请求的流程。