Rails - id没有从下拉列表传递到链接

时间:2012-07-04 08:54:29

标签: javascript ruby-on-rails action

我想要实现的是在下拉菜单中有一个项目列表,这样当从该下拉列表中选择一个项目时,只有与该项目相关的任务等显示在其他页面上。我通过在该项目的节目视图中使用按钮使其工作正常,但如果用户可以这样选择它会更快。

下面的代码显示了我在索引视图中到目前为止所得到的内容(多亏了cutalion!) - 似乎是问题的第三行 - 选择链接。它给出的错误是它找不到没有id的项目。当页面显示时(当我删除该行时)下拉列表中列出了一个项目 - 那么为什么id没有被传递?此外,当从代码中删除第三行以使页面显示时,第二行生成的链接指向索引视图而不是显示视图。我猜这与id没有通过有关,但我不知道如何解决它!

任何人都可以解决这个问题会很棒,谢谢!

项目/索引视图(更新代码以纠正不一致):

<%= collection_select(:project, :id, Project.all, :id, :name) %>
<%= link_to 'Show', @project, :id => "show_project_button" %>
<%= link_to "Select" select_project_project_path(@project), id: "select_project_button" %>


<script type="javascript">
  $('#project_id option').change(function(){
    var project_id = $(this).val();
    $('#show_project_button').attr('href', '/projects/' + project_id);
    $('#select_project_button').attr('href', '/projects/' + project_id + '/select_project');
  })
</script>

此外,项目控制器中的select_project操作:

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

2 个答案:

答案 0 :(得分:0)

似乎@project为空,因此无法找到任何ID。

将控制器中的此行更改为:

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

如果无法找到项目,您还必须考虑会发生什么。如果发生这种情况,您将遇到与现在相同的问题。

答案 1 :(得分:0)

我不知道您是否发布了实际代码,但是那里的ID不匹配:

<%= collection_select(:project, :id, Project.all, :id, :name) %>
<%= link_to "Show", @project, id: "show_project_btn" %> # this should be id: "show_project_button"
<%= link_to "Select" select_project_project_path(@project), id: "select_project_btn" %> # and this should be id: "select_project_button", right?

<script type="javascript">
  $('#project_id').change(function(){
    var project_id = $(this).val();
    $('#show_project_button').attr('href', '/project/' + project_id);
    $('#select_project_button').attr('href', '/projects/' + project_id + '/select_project');
  })
</script>

另外,你在javascript中有不一致的路径

$('#show_project_button').attr('href', '/project/' + project_id); // rails generates /projects, I think