Rails - 使用下拉列表将对象的id传递给会话

时间:2012-07-04 12:34:27

标签: ruby-on-rails session drop-down-menu action

目前,我在项目/索引视图中有一个项目列表。用户当前要做的是单击项目上的“显示”,然后单击“选择项目”。这会调用我在控制器中创建的自定义操作,该操作会将项目的ID传递到会话中,因此以下页面中仅显示相关任务等。

我想要发生的是在索引视图上有一个下拉菜单,其中包含所有项目的列表。然后,当单击提交按钮时,它会将该项目的ID传递给会话,完全相同。我已经尝试过各种各样的方法来做这件事,但我无法得到任何工作 - 主要是因为看起来好像项目的ID没有从下拉列表中传递出去。

我的问题是 - 如何让提交按钮调用自定义操作,该操作将从下拉菜单的项目中获取ID并将其传递到会话中?

我不知道是否需要将代码添加到控制器的索引操作,或者提交按钮是否可以调用自定义操作。我对rails很新,所以越多人拼出来的东西越好!

这是项目/索引:

<%= form_for(@project) do |f| %>
  <% if @project.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@project.errors.count, "error") %> prohibited this project from being saved:</h2>

      <ul>
      <% @project.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>
  <div class="field">
  <%= f.hidden_field :company_id, :value => session[:company_id] %>
  </div>
  <div class="field">
  <%= collection_select :project, :id, Project.all, :id, :name %>
  </div>
  <div class="actions">
    <%= f.submit 'Select Project', :class => "btn btn-primary" %>
  </div>
<% end %>

目前为止的控制器代码:

def index
  @projects = Project.all

  respond_to do |format|
    format.html # index.html.erb
    format.json { render json: @projects }
  end
end

def select_project
  project = Project.find(params[:id])
  session[:project_id] = project.id
  redirect_to root_url, notice: "Current project set to: #{project.name}, ID: #{project.id}"
end

我不能把

@project = Project.find(params[:id])

进入索引操作,否则表示无法找到没有id的项目。

1 个答案:

答案 0 :(得分:0)

当您提交表单时,这将通过控制器中的更新或创建操作完成。

我可以问你为什么要从会话中加载你的下拉列表?因为你可以使用rails helper来查找(过滤)记录,使用:where etc。

返回数组后,您可以在下拉列表中将它们列为选项属性。并将它们提交给您的更新或创建操作。一旦你在那里,你可以使用

从提交的哈希中获取值
params[:key][:nested_key]

或只是

params[:key]

当您在此处执行此操作时,您甚至可以将这些绑定到会话或变量以供以后使用。

尽可能让流程变得健壮和轻松。

玩得开心