【问题标题】:Rails: Pass parameter from view to controllerRails:将参数从视图传递到控制器
【发布时间】:2013-03-27 17:33:13
【问题描述】:

我在 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 在许多控制器中可见,所以我认为我应该使用会话变量或类似的东西?

【问题讨论】:

  • 欢迎来到 SO!当您找到对您最有帮助的答案后,accept it

标签: ruby-on-rails ruby controller models


【解决方案1】:

您想使用嵌套资源

routes.rb

resources :project do
  resources :tasks
end

这会让你做&lt;%= link_to 'Tasks', tasks_project_path(@project) %&gt;

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

然后在控制器中:

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

【讨论】:

  • 如果您不希望任务索引列出所有任务,您可以这样做。
  • 但是如何使 project_id 对任务中的其他控制器可见?
  • 按照惯例,你所有的任务都可以通过task.project恢复你的项目。
  • @codeit,您仍然可以通过可选地获取项目(因此 parent 是可选的)来显示所有任务。涉及到更多的逻辑。
  • @user2216744,您的意思是控制器中的其他操作吗?我会创建一个前置过滤器来设置项目(before_filter :set_project)。这样每次都会被检索到,希望能回答你的问题。
【解决方案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

或者:

你可以修改你indextasks_controller:

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-07-29
      • 1970-01-01
      • 1970-01-01
      • 2013-12-30
      • 2014-12-01
      相关资源
      最近更新 更多