0

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

我想要发生的是在索引视图上有一个下拉菜单,其中包含所有项目的列表。然后,当单击提交按钮时,它会将那个项目的 id 传递到会话中,完全相同。我已经尝试了所有我能想到的方法,但我什么也做不了——主要是因为它看起来好像项目的 id 没有从下拉列表中传递。

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

不知道是否需要将代码添加到控制器的 index 动作中,或者提交按钮是否可以调用自定义动作。我对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])

进入 index 动作,否则它说它找不到没有 id 的项目。

4

1 回答 1

0

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

请问您为什么要从会话中加载下拉列表?因为您可以使用 rails helpers 使用 :where 等查找(过滤的)记录。

一旦你得到一个返回的数组,你可以在你的下拉列表中列出它们作为选项属性。并将它们提交给您的更新或创建操作。一旦你在那里,你可以使用从提交的哈希中获取值

params[:key][:nested_key]

要不就

params[:key]

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

试着让流程尽可能的健壮和简单。

玩得开心

于 2012-07-04T15:20:37.777 回答