Rails:将参数从视图传递到控制器

我在轨道中有以下型号:

class Task  true end class Project < ActiveRecord::Base attr_accessible :name has_many :tasks end 

我有一个列出可用项目的视图单击任何项​​目我要打开一个列出所单击项目中所有任务的页面。 现在的问题是如何传递项目ID? 我还希望项目ID在之后的许多控制器中可见,所以我认为我应该使用会话变量或类似的东西?

您想要使用嵌套资源

的routes.rb

 resources :project do resources :tasks end 

这将允许您执行<%= link_to 'Tasks', tasks_project_path(@project) %>

然后你有一个控制器来完成任务,参数包括:project_id /projects/:project_id/tasks

然后在控制器中:

 class TasksController < ApplicationController def index @project = Project.find(params[:project_id]) @tasks = @project.tasks end end 

你可以这样做:

  <%= link_to 'Get tasks of project', {:controller => :tasks, :action => :list_project_tasks}, :params => {:project_id => project.id} %> 

这里list_project_taskstasks_controller一个动作

  def list_project_tasks @project_tasks = Project.find(params[:id]).tasks end 

要么:

您可以修改tasks_controller index

 <%= link_to 'Get tasks of project', {:controller => :tasks, :action => :index}, :params => {:project_id => project.id} %> def index @tasks = Project.find(params[:project_id]).try(:tasks) || Task.all end 

1)单击任何项​​目我想打开一个列出所单击项目中所有任务的页面。 – 为此,我建议使用Rails提供的link_to帮助程序,并通过Rails路由链接到该项目。 例如,您的视图将列出所有项目,并且将使用<%= link_to project.name, @project %><%= link_to project.name, project_path(@project) %>显示每个项目项目。

您可以通过在命令行中键入rake routes来查看路由列表。

2)我不确定你的意思,但如果你使用的url是/ projects / 12 /任何资源,下面的控制器(例如/ projects / 12 / tasks / 15)可以访问project_id params [:project_id],假设您的路由设置为嵌套路由。