Javascript 如何从视图中的控制器筛选结果

Javascript 如何从视图中的控制器筛选结果,javascript,ruby-on-rails,ruby,ajax,Javascript,Ruby On Rails,Ruby,Ajax,我需要在视图中显示一些元素,然后根据用户选择过滤它们。我试图将控制器结果中的变量与javascript变量进行比较,但在这种情况下似乎是不可能的 我有以下型号: create_table "appointments", force: true do |t| t.integer "doctor_id" t.integer "user_id" t.datetime "start_date" t.datetime "created_at" t.datetim

我需要在视图中显示一些元素,然后根据用户选择过滤它们。我试图将控制器结果中的变量与javascript变量进行比较,但在这种情况下似乎是不可能的

我有以下型号:

create_table "appointments", force: true do |t|
    t.integer  "doctor_id"
    t.integer  "user_id"
    t.datetime "start_date"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.datetime "end_date"
end
在我的控制器中,我有以下功能来获得所有约会:

@appointments = Appointment.all
现在,在我的视图中,我显示所有约会,如下所示:

events: 
    [
    <% @appointments.each do |appointment| %>
      {
        id     : "<%= appointment.id %>",
        title  : "Reserved",
        start  : "<%= appointment.start_date.in_time_zone.strftime '%Y-%m-%dT%H:%M:%S' %>",
        end    : "<%= appointment.end_date.in_time_zone.strftime '%Y-%m-%dT%H:%M:%S' %>",
        allDay : false
      },
    <% end %>
    ],
事件:
[
{
id:“”,
标题:“保留”,
开始:“,
完:,
全天:错
},
],
这很好,但我有一个选项,用户可以选择一个医生,只有从该医生的预约应该出现。我怎样才能做到这一点?我试图像这样过滤它们,但不起作用:

events: 
    [
    <% @appointments.each do |appointment| %>
    if <%= appointment.doctor_id %> == doctor_id{
      {
        id     : "<%= appointment.id %>",
        title  : "Reserved",
        start  : "<%= appointment.start_date.in_time_zone.strftime '%Y-%m-%dT%H:%M:%S' %>",
        end    : "<%= appointment.end_date.in_time_zone.strftime '%Y-%m-%dT%H:%M:%S' %>",
        allDay : false
      },
      }
    <% end %>
    ],
事件:
[
如果==医生id{
{
id:“”,
标题:“保留”,
开始:“,
完:,
全天:错
},
}
],

谢谢大家。

编辑:要使用选择框仅获得一名医生的预约,请在选择框中选择一个选项后首先发送ajax请求:

$("select").change(function() {
  $.ajax({
    type: 'POST',
    data: 'selected=' + $("select option:selected").text(),
    dataType: 'json',
    success: function(data) {
      if ($.trim(data) !== '') {
        // data should be the returned json of all the appointments for only the selected doctor. Do whatever you want with it.
      }
    },
    error: function(jqXHR, textStatus, errorThrown) {
      console.log(textStatus);
      console.log(errorThrown);
    },
    url: <insert post route here>
  })
});
文件:app/views/your_controller/retrieve_doctor_id.json.erb:

events: 
[
<% appointments.each do |appointment| %>
  {
    id     : "<%= appointment.id %>",
    title  : "Reserved",
    start  : "<%= appointment.start_date.in_time_zone.strftime '%Y-%m-%dT%H:%M:%S' %>",
    end    : "<%= appointment.end_date.in_time_zone.strftime '%Y-%m-%dT%H:%M:%S' %>",
    allDay : false
  },
<% end %>
],
事件:
[
{
id:“”,
标题:“保留”,
开始:“,
完:,
全天:错
},
],

我尚未对此进行测试,请告诉我是否有任何错误或问题。

编辑:要使用选择框仅获取一名医生的预约,请在选择框中选择一个选项时首先发送ajax请求:

$("select").change(function() {
  $.ajax({
    type: 'POST',
    data: 'selected=' + $("select option:selected").text(),
    dataType: 'json',
    success: function(data) {
      if ($.trim(data) !== '') {
        // data should be the returned json of all the appointments for only the selected doctor. Do whatever you want with it.
      }
    },
    error: function(jqXHR, textStatus, errorThrown) {
      console.log(textStatus);
      console.log(errorThrown);
    },
    url: <insert post route here>
  })
});
文件:app/views/your_controller/retrieve_doctor_id.json.erb:

events: 
[
<% appointments.each do |appointment| %>
  {
    id     : "<%= appointment.id %>",
    title  : "Reserved",
    start  : "<%= appointment.start_date.in_time_zone.strftime '%Y-%m-%dT%H:%M:%S' %>",
    end    : "<%= appointment.end_date.in_time_zone.strftime '%Y-%m-%dT%H:%M:%S' %>",
    allDay : false
  },
<% end %>
],
事件:
[
{
id:“”,
标题:“保留”,
开始:“,
完:,
全天:错
},
],

我还没有测试过这个,所以告诉我它是否有任何错误或问题。

类似的东西应该可以工作

events: 
    [
    <% @appointments.select { |a| a.doctor_id == @doctor_id }.each do |appointment| %>
      {
        id     : "<%= appointment.id %>",
        title  : "Reserved",
        start  : "<%= appointment.start_date.in_time_zone.strftime '%Y-%m-%dT%H:%M:%S' %>",
        end    : "<%= appointment.end_date.in_time_zone.strftime '%Y-%m-%dT%H:%M:%S' %>",
        allDay : false
      },
    <% end %>
    ],
事件:
[
{
id:“”,
标题:“保留”,
开始:“,
完:,
全天:错
},
],

假设
@doctor\u id
是您要筛选的医生的id。不过,我必须指出,这种做法确实很混乱。您应该真正使用json构建器,例如。

类似的东西应该可以工作

events: 
    [
    <% @appointments.select { |a| a.doctor_id == @doctor_id }.each do |appointment| %>
      {
        id     : "<%= appointment.id %>",
        title  : "Reserved",
        start  : "<%= appointment.start_date.in_time_zone.strftime '%Y-%m-%dT%H:%M:%S' %>",
        end    : "<%= appointment.end_date.in_time_zone.strftime '%Y-%m-%dT%H:%M:%S' %>",
        allDay : false
      },
    <% end %>
    ],
事件:
[
{
id:“”,
标题:“保留”,
开始:“,
完:,
全天:错
},
],

假设
@doctor\u id
是您要筛选的医生的id。不过,我必须指出,这种做法确实很混乱。您真的应该使用json构建器,例如。

谢谢,但这不起作用,因为doctor_id是一个javascript变量,我是在用户从下拉菜单中选择一个选项后创建的。我收到以下错误:“未定义的局部变量或方法'doctor_id'@ZdravkoVajudin我认为比较javascript变量和ruby/rails变量的唯一方法是在更改选择框后发出ajax post请求,然后,它转到一个控制器,该控制器将约会的
医生id
发送回javascript。我会用我所说的更新我的答案。@ZdravkoVajudin我已经更新了我的答案,希望它能更好地工作。我想我们很接近了。剩下的唯一问题是@Appointment在填写事件时不包含数据。我收到以下错误:nil的未定义方法'each':nilclass当我尝试在'success'函数中打印id时,我可以这样成功地打印它:警报(数据[0].id);所以@appoints是在controller中设置的,但它不是在视图内部设置的。谢谢,但这不起作用,因为doctor_id是一个javascript变量,我在用户从下拉菜单中选择一个选项后创建它。我收到以下错误:“未定义的局部变量或方法'doctor_id'@ZdravkoVajudin我认为比较javascript变量和ruby/rails变量的唯一方法是在更改选择框后发出ajax post请求,然后,它转到一个控制器,该控制器将约会的
医生id
发送回javascript。我会用我所说的更新我的答案。@ZdravkoVajudin我已经更新了我的答案,希望它能更好地工作。我想我们很接近了。剩下的唯一问题是@Appointment在填写事件时不包含数据。我收到以下错误:nil的未定义方法'each':nilclass当我尝试在'success'函数中打印id时,我可以这样成功地打印它:警报(数据[0].id);所以@appoints是在controller中设置的,但它不是在视图内部设置的。嗯…谢谢,但问题是,当用户从下拉菜单中选择一个选项时,会创建doctor_id,所以这是一个javascript变量,我不能这样比较。谢谢,但问题是,doctor_id是在用户从下拉菜单中选择一个选项时创建的,所以这是一个javascript变量,我不能这样比较。