如何使用AJAX将数据从ruby控制器发送到应用程序javascript?

时间:2016-02-10 09:04:42

标签: javascript jquery ruby-on-rails ruby ajax

我的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初学者

2 个答案:

答案 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">&nbsp;</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

,您会更好理解

enter image description here

答案 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请求的流程。