创建一个调用方法的选择框

时间:2012-04-22 21:00:49

标签: ruby-on-rails select tags link-to

我有一个带有标签的工作报告的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" %>

等等每个标签。这很好但是体积大且不合需要。有没有办法通过选择框做同样的事情?

1 个答案:

答案 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 ) %>');

这将使用新内容更新报告容器。