Rails 4 - 如何将“select_year()”的值从视图传递给控制器

时间:2015-09-23 09:03:58

标签: ruby-on-rails ajax

在这里输入noob。我正在尝试创建一个下拉菜单,用于在视图中选择“年”并将此值传递给我的控制器,以便我可以从数据库中找到相应的数据。

我不确定正确的过程是什么。到目前为止,我已经在视图中使用“select_year()”创建了一个下拉菜单,该链接基本上指向控制器操作“索引”并尝试执行AJAX,并使用“index.js.erb”渲染结果进入当前视图。

但是,我不确定如何从“select_year()”选择中获取值,并且我应该将此值传递给我的控制器以查找数据或的模型

请随意指出我在AJAX过程的其余部分可能出现的任何错误,我无法测试它,因为我甚至无法从视图中获取值到控制器......

articles_controller.rb

class ArticlesController < ApplicationController

def index
    @articles = Article.all

    @articleSelect = Article.find(???????????)

    # Would this be correct? @a = Article.find(params[:foo])


    respond_to do |format|

        format.js # render articles/index.js.erb
    end
end

index.html.erb

<div class="container-fluid">
    <div class="main">
        <!-- Year -->

        <%= select_year (Date.today, start_year: 1960, end_year: 2016, prompt: 'Choose a Year...') %>

<!-- I thought adding a field_name: "year" would help me to identify the value in the controller but it didn't work. -->

        <%= link_to "Show", articles_path, remote: true %>


        <div id="show">
            <%= render @dropDownResults %>
        </div>

    </div>
</div>

index.js.erb的

$('#show').append("<%= j render @dropDownResults %>");

_dropDownResults.html.erb

<div>
    <% @articleSelect.each do |a| %>
        <h1><%= a.title %></h1>
        <h2><%= a.author %></h2>
        <h3><%= a.year %></h3>
    <% end %>
</div>

非常感谢任何帮助或建议!

2 个答案:

答案 0 :(得分:1)

您可以将此功能添加到您的视图中:

<script type="text/javascript">
function refreshDivShow (){
    $.ajax({
        type: 'POST',
        dataType: "script",
        url: "<%= articles_path %>?authenticity_token=" + $('meta[name=csrf-token]').attr('content'),
        data: {
            year: $('#yourYearInput').val()
        }
    });
}
</script>

并且可以从控制器函数year访问index参数的值

params[:year]

或来自部分index.js.erb_dropDownResults.html.erb注入

<%= params[:year] %>

答案 1 :(得分:0)

尝试使用remote:true使用表单提交您选择的值。尝试更改您的代码,如下所示:

<div class="container-fluid">
    <div class="main">
        <%= form_tag(articles_path,:method=>'get', :remote => "true") do %>

        <%= select_year (Date.today, start_year: 1960, end_year: 2016, prompt: 'Choose a Year...') %>
        <%= submit_tag "Show" %>
        <% end %>


        <div id="show">
            <%= render @dropDownResults %>
        </div>

    </div>
</div>

通过这种方式,您可以获得所需的结果。或者您可以在下拉列表更改事件中触发ajax并相应地更改代码。使用当前代码,您无法使用link_to标记将所选选项发送到索引。