如何使用ajax和jquery显示基于用户输入的选择 [英] How to display a selection based on user input using ajax and jquery

查看:102
本文介绍了如何使用ajax和jquery显示基于用户输入的选择的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

将下面看作是自行车出租。有人填写表格并获得一辆自行车分配给他们,他们可以租借一段时间。



我遇到的问题是我试图在他们提交表格之前,向想要租用自行车的人显示哪些自行车可用。以下是我使用ajax的尝试。



请求控制器方法

  def new 
@bikes = Bike.available_based_on_request_date(params [:Borrow_date],params [:Return_date])
@new_request = Request.new
end

在下面创建方法(临时解决方法,重新加载表单,并提供有关可用性的警告。)

  def create 
@request = Request.new(request_params)
available_bikes = @ request.new_request(current_user.id)
if(available_bikes> = @ request.number_of_bikes_wanted)&& @ request.save
redirect_to root_path
else
flash [:warning] =您要求的自行车数量超过了可用数量,只有#{available_bikes}自行车可用
redirect_to new_request_url
end
end

请求控制器中的参数

  def request_params 
params.require(:request).permit(:Borrow_time,:Borrow_date,
:Return_date,:Return_time,
:number_of_bikes_wanted,bike_ids:[])
结束



new.html.erb view

 < div class =formalign =center> 
<%=呈现'form.js.erb'%>
< / div>

下面的_form.js.erb

 < script type =text / javascript> $('。my-date')。on('change',function(){
var data = {} $ b(document).ready(function(){
$ ($(this).val()){
data [$(this).attr)
$('。my-date')。 (id)] = $(this).val();
}
});

if(Object.keys(data).length> 1) {
。.ajax({
type:POST,
url:<%= new_request_path%> ;,
data:data
});
}
});
});

var options =;

<%@ bikes.each do | bike | %GT;
options + =< option value ='<%= bike.id%>'><%= bike.name%>< / option>
<%end%>

$('#request_number_of_bikes_wanted')。html(options);
< / script>


< div class =block-italign = center>
< br>
<%= form_for @new_request do | request | %GT;

<%= request.label:借用日期,'借用于'%>
<%= request.date_field:借用日期,id:'借用日期',class:'my-date',min:Date.today,:required => true%>

<%= request.label:借入时间,'借用'%>
<%= request.time_field:借用时间,值:'10:00',分钟:'9:00 AM',最大:'4:30 PM',默认:'10:AM AM',: ignore_date => true,:required => true%>
< br>< br>
<%= request.label:Return_date,'返回'%>
<%= request.date_field:Return_date,id:'Return_date',class:'my-date',min:Date.today,:required => true%>

<%= request.label:Return_time,'返回'%>
<%= request.time_field:Return_time,值:'10:00',min:'9:00 AM',max:'4:30 PM',默认:'10:AM AM',: ignore_date => true,:required => true%>
< br>< br>
< br>< br>
<%= request.label:NumberOfBikesWanted,'自行车数量%>
<%= request.select:number_of_bikes_wanted,%w(select_bike),:required => true%>
< br>
<%= request.submit'提交'%>
<%= request.submit'重置',:type => '重置'%>
<%end%>
< br>
< / div>


解决方案

您的代码有两个主要问题:



控制器



使用不同的操作来设置您将使用ajax调用的端点,所以不要这样做:

  def new 
@bikes = Bike.available_based_on_request_date(params [:Borrow_date],params [:Return_date])
@new_request = Request.new
end

试试这个:

  def bikes 
@bikes = Bike.available_based_on_request_date(params [:Borrow_date],params [:Return_date])

def new
@new_request = Request.new
end

如果你想保留REST路由,然后创建一个新的控制器并使用该控制器内的 index 动作。





这段代码:

  var options =; 

<%@ bikes.each do | bike | %GT;
options + =< option value ='<%= bike.id%>'><%= bike.name%>< / option>
<%end%>

$('#request_number_of_bikes_wanted')。html(options);

不属于此处,它必须从您的文件中删除,并将其放在新文件中称为 bikes.js.erb ;也将您的表单重命名为 _form.html.erb



然后更新您的ajax调用以使用您的新路线:

  $。ajax({
type:POST,
url:<%= bikes_path %>,
data:data
});






您要设置的是新端点,但它不会返回 html ,它将返回一个 js 。但是你必须把它当作一个独立的动作,就像任何其他的动作一样。唯一的区别是您如何调用该操作( ajax )以及如何响应它( js )。 p>

Think of the below as a bike rental. Someone fills out a form and gets a bike assigned to them which they can rent and borrow for a certain amount of time.

The problem I am having is I am trying to show the person who wants to rent the bikes what bikes are available before they submit the form. Below is my attempt using ajax. I have no errors but also my select is not updating.

request controller methods below

 def new
    @bikes = Bike.available_based_on_request_date(params[:Borrow_date], params[:Return_date])
    @new_request = Request.new
  end

create method below (with a temporary workaround, that reloads the form with a warning about availability.)

 def create
    @request = Request.new(request_params)
    available_bikes = @request.new_request(current_user.id) 
    if (available_bikes >= @request.number_of_bikes_wanted) && @request.save
      redirect_to root_path
    else
      flash[:warning] = "You have requested more bikes than available. There are only #{available_bikes} bikes available"
      redirect_to new_request_url
    end
  end

params in request controller

 def request_params
    params.require(:request).permit(:Borrow_time, :Borrow_date,
                                    :Return_date, :Return_time,
                                    :number_of_bikes_wanted, bike_ids: [])
  end

new.html.erb view

  <div class="form" align = "center">
   <%= render 'form.js.erb'  %>
  </div>

_form.js.erb below

<script type="text/javascript">
$(document).ready(function() {
   $('.my-date').on('change', function() {
     var data = {}

     $('.my-date').each(function() {
       if($(this).val()) {
         data[$(this).attr("id")] = $(this).val();
       }
     });

     if(Object.keys(data).length > 1) {
       $.ajax({
         type: "POST",
         url: <%= new_request_path %>,
         data: data
       });
     }
   });
 });

var options = "";

<% @bikes.each do |bike| %>
options += "<option value='<%= bike.id %>'><%= bike.name %></option>"
<% end %>

$('#request_number_of_bikes_wanted').html(options);
</script>


<div class="block-it" align=center>
<br>
<%= form_for @new_request do |request| %>

<%= request.label :Borrow_date, 'Borrow on' %>
<%= request.date_field :Borrow_date, id: 'Borrow_date', class: 'my-date', min: Date.today, :required => true %>

<%= request.label :Borrow_time, 'Borrow at' %>
<%= request.time_field :Borrow_time, value: '10:00', min: '9:00 AM', max: '4:30 PM', default: '10:00 AM', :ignore_date => true, :required => true %>
<br><br>
<%= request.label :Return_date, 'Return On' %>
<%= request.date_field :Return_date, id: 'Return_date', class: 'my-date', min: Date.today, :required => true %>

<%= request.label :Return_time, 'Return at' %>
<%= request.time_field :Return_time, value: '10:00', min: '9:00 AM', max: '4:30 PM', default: '10:00 AM', :ignore_date => true, :required => true %>
<br><br>
<br><br>
<%= request.label :NumberOfBikesWanted, 'Number of bikes' %>
<%= request.select :number_of_bikes_wanted, %w(select_bike), :required => true %>
<br>
<%= request.submit 'Submit' %>
<%= request.submit 'Reset', :type => 'reset' %>
<% end %>
<br>
</div>

解决方案

There are a two main problems with your code:

Controller

Use a different action to set the endpoint that you will call with ajax, so instead of this:

def new
    @bikes = Bike.available_based_on_request_date(params[:Borrow_date], params[:Return_date])
    @new_request = Request.new
end

Try this:

def bikes
    @bikes = Bike.available_based_on_request_date(params[:Borrow_date], params[:Return_date])

def new
    @new_request = Request.new
end

If you want to keep REST routes, then create a new controller and use the index action within that controller.

Form

This code:

var options = "";

<% @bikes.each do |bike| %>
  options += "<option value='<%= bike.id %>'><%= bike.name %></option>"
<% end %>

$('#request_number_of_bikes_wanted').html(options);

doesn't belong here, it must be deleted from your file and instead put it on a new file called bikes.js.erb; also rename your form to _form.html.erb.

And update your ajax call to use your new route:

$.ajax({
  type: "POST",
  url: <%= bikes_path %>, 
  data: data
});


What you want to setup is a new endpoint but instead of returning html, it will return a js. But you must treat it as an independent action, just as any other action in rails. The only difference is how you call that action (ajax) and how you respond to it (js).

这篇关于如何使用ajax和jquery显示基于用户输入的选择的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆