1

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

每个标签依此类推。这工作正常,但体积庞大且不可取。有没有办法通过选择框做同样的事情?

4

1 回答 1

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 请求。.change()每当有人进行更改时,jQuery方法就会触发。该$.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 ) %>');

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

于 2012-04-22T22:42:50.207 回答