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

时间:2013-03-27 17:33:13

标签: ruby-on-rails ruby controller models

我在rails中有以下模型:

class Task < ActiveRecord::Base
  attr_accessible :description, :name, :project
  belongs_to :project

  validates :name, :presence => true

end

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

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

3 个答案:

答案 0 :(得分:3)

您想要使用嵌套资源

的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

答案 1 :(得分:2)

你可以这样做:

 <%= 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

或者:

您可以修改index的{​​{1}}:

tasks_controller

答案 2 :(得分:0)

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)假设您的路由设置为嵌套路由,则可以以params [:project_id]的形式访问project_id。