【发布时间】:2014-12-26 11:23:45
【问题描述】:
在一些帮助下,我现在可以将参数传递给控制器中的方法。我现在坚持的是如何使用该方法并将其分配给我的实例变量。
class PublicController < ApplicationController
def rehome
@animals = Animal.animals_rehome.paginate(:page => params[:page], :per_page => 6)
respond_to do |format|
format.html
format.js
end
end
def rehomed
respond_to do |format|
format.js {render :json => Animal.where(animal_type: params[:animal_type]) }
end
end
使用以下 ajax 帖子更新参数
$('select.btn').on('change', function() {
var animal_type = $('#animalType option:selected').text();
var animal_town = $('#animalTown option:selected').text();
$.ajax({
type: 'POST',
url: '/public/rehomed',
data: {
animal_type: animal_type,
},
success: function(data) {
console.log(data);
}
});
});
我想要实现的是在初始页面加载时使用
def rehome
@animals = Animal.animals_rehome.paginate(:page => params[:page], :per_page => 6)
end
但是当通过选择下拉菜单选择我想要的过滤器时
def rehome
@animals = rehomed.paginate(:page => params[:page], :per_page => 6)
end
但我不确定如何设置。
编辑
我的设置现在看起来像
class PublicController < ApplicationController
before_filter :default_animal
def rehome
respond_to do |format|
format.html
format.js
end
end
def rehomed
conditions = {}
conditions.merge!(animal_type: params[:animal_type]) if params[:animal_type].present?
conditions.merge!(rehomed: params[:rehomed]) if params[:rehomed].present?
conditions.merge!(users: {town: params[:animal_town]}) if params[:animal_town].present?
@animals = Animal.joins(:user).where(conditions)
respond_to do |format|
format.js { render json: @animals }
end
end
private
def default_animal
@animals = Animal.animals_rehome.paginate(:page => params[:page], :per_page => 6)
end
end
每次下拉列表在视图中更新时,我的 ajax 请求都会发送正确的参数来构建 @animals 查询,而我想要实现的是将新查询的结果加载到与will_paginate 结构(如果可能的话)。
$('select.btn').on('change', function() {
var animal_type = $('#animalType option:selected').text();
var animal_town = $('#animalTown option:selected').text();
var data_send = { animal_type: animal_type, animal_town: animal_town, rehomed: false}
if(animal_type == 'All') {
data_send = {animal_town: animal_town, rehomed: false}
}
if(animal_town == 'All') {
data_send = {animal_type: animal_type, rehomed: false}
}
$.ajax({
type: 'POST',
url: '/public/rehomed',
data: data_send,
success: function(data) {
console.log(data);
}
});
});
查看rehome.html.erb
<div class="all_animals">
<%= render @animals %> # this is in a partial called _animal.html.erb
</div>
<div id="infinite-scrolling">
<%= will_paginate @animals %>
</div>
rehome.js.erb
$('.all_animals').append('<%= j render @animals %>');
<% if @animals.next_page %>
$('.pagination').replaceWith('<%= j will_paginate @animals %>');
<% else %>
$(window).off('scroll');
$('.pagination').remove();
【问题讨论】:
-
请求之间不存储实例变量。您必须为每个请求重新创建状态。为此,您需要保留辅助数据(例如,当前页码或动物类型)。通常这是通过查询字符串完成的。
-
你能否提供一个例子来说明你的意思,不太理解你的解释
-
他的意思是每次你想显示从 rehomed 在
@animals中查询的更新值时,你需要创建一个新请求,一种方法是更新 jQuery 的 @ 中的视图/HTML 987654332@回调。 -
我什至不知道从哪里开始,你知道任何给出例子的文献吗..
-
首先,在调用 rehomed 之前调用了 default_animal,这意味着已经设置了
@animals。然后,您将在重新设置的操作@animals = Animal.joins(:user).where(conditions)中覆盖它的值。我的意思是,也许你不需要在 rehomed 中调用过滤器。不太清楚如何做,但如果你渲染部分会更容易。在 rehomed 操作中呈现 rehome 布局,并在 ajax 请求返回时将该视图插入到您的 html 正文中。它会自动更改分页。@animals必须在 rehomed with pagination 中设置
标签: jquery ruby ajax json ruby-on-rails-4