我有一个带有标签的工作报告的rails应用程序。在Report / Index.html.erb中,我希望用户能够通过选择标记对报告进行排序。他们一次只能选择一个标签,所以我觉得选择框最好。我目前有这个:
<%= select("preferences", :tag_with,
["Politics", "Technology", "Entertainment", "Sports", "Science", "Crime",
"Business", "Social", "Nature", "Other"], :prompt => "Filter Feed by:" )%>
我有一个工作首选项控制器,其方法调用tag_with
可以更新当前标记。但是,此代码仅生成选择框。我希望它是当用户选择其中一个标签时,它从首选项控制器调用tag_with方法。
我生成了一系列完成任务的link_to
行,但我真的很喜欢一个选择框。
<%= link_to "Politics", :action => "tag_with", :tag => "Politics", :controller =>"preferences" %>
<%= link_to "Entertainment", :action => "tag_with", :tag => "Entertainment", :controller =>"preferences" %>
<%= link_to "Science", :action => "tag_with", :tag => "Science", :controller =>"preferences" %>
<%= link_to "Technology", :action => "tag_with", :tag => "Technology", :controller =>"preferences" %>
等等每个标签。这很好但是体积大且不合需要。有没有办法通过选择框做同样的事情?
答案 0 :(得分:1)
在您的reports.js.coffee
文件或您想要的任何其他js文件中。
jQuery ->
$('select#preferences').change ->
$.get 'preferences/tag_with',{ term: $('option:selected', this). val() }
或者,如果你想使用常规的javascript:
$(function(){
$('select#preferences').change( function() {
$.get('preferences/tag_with',{term: $('option:selected',this).val()});
});
});
链接是GET请求。只要有人做出更改,jQuery .change()
方法就会触发。 $.get
方法向URL发送GET请求并可以传递数据(第二个参数)。这些数据成为你的参数哈希,所以在上面的例子中你会得到:
params[:term] #=> the value attribute of whatever option was selected by the user
请参阅.change()和$.get()上的jQuery文档以获取更多帮助。
<强>更新强>
为了刷新页面,最简单的方法是将要更改的表提取为部分,假设它被称为_report.html.erb
。部分应该看起来像这样:
<div id="report">
<%= render @report %>
</div>
*注意:render @report
只是render :partial => 'report'
的缩写。见http://guides.rubyonrails.org/layouts_and_rendering.html *
在首选项控制器中,使用tag_with选项,您应该确保设置@report
对象(或其他任何将数据提供给您的部分)。
然后你应该创建一个名为views/preferences/tag_with.js.erb
的文件并在其中添加这样的内容:
$('div#report').html('<%= escape_javascript( render @report ) %>');
这将使用新内容更新报告容器。