【发布时间】:2015-01-18 17:02:59
【问题描述】:
我正在进行我的第一个 Rails 项目,并且已经到了想要根据 SELECT 标记的值更改模型索引的 ORDER BY 的阶段。
我的 index.html.erb 中有以下 onchange
<div id="sortBy">
<span>Sort by:</span>
<%= select_tag "sort_by", options_for_select([ "Newest first", "Oldest first" ], "Newest first"), { :onchange => "changeSortOrderJs(this.value)" } %>
</div>
这应该更新:
<% @horses.each do | horse | %>
<%= horse.name %>
<% end %>
这会在我的咖啡脚本资产中调用以下方法(以 @ 为前缀,因为它是一个匿名函数):
@changeSortOrderJs = (val) ->
$.ajax
type: 'GET'
url: '/horses'
data: order: val
这映射到我在 HorsesController 中的索引操作
def index
order = params[:order]
if(order == nil)
order = 'Newest first'
end
@horses = Array.new
if order == 'Newest first'
@horses = Horse.all.order("created_at DESC")
elsif order == 'Oldest first'
@horses = Horse.all.order("created_at ASC")
end
//tried this later but didn't work either
respond_to do |format|
format.html
end
end
我可以在我的 development.log 中看到它正在工作,并且 @horses 正在以正确的顺序填充。但是视图没有刷新。
如果我在 ajax 调用中使用 respond_with(@horses) 然后成功回调,即
@changeSortOrderJs = (val) ->
$.ajax
type: 'GET'
url: '/horses'
data: order: val
success: (result) ->
$('body').html(result)
然后它确实起作用了,马被重新排序。但我宁愿不这样替换整个身体。
我认为实例变量的全部意义在于您可以重新定义它们并且视图会自动更新?
【问题讨论】:
-
顺便说一句,
:onchange => "changeSortOrderJs(this.value)"有点老派,你最好用$('#sortBy select').change -> ...这样的东西。
标签: jquery ruby-on-rails ajax ruby-on-rails-4 coffeescript