Ruby on rails 3 Rails 3为特定的父级创建新的子级

Ruby on rails 3 Rails 3为特定的父级创建新的子级,ruby-on-rails-3,for-loop,parent,Ruby On Rails 3,For Loop,Parent,大家好!刚刚加入了stack overflow,因为它在开始学习Ruby on Rails 3时是一个有用的资源 虽然我似乎找不到一个特别的答案,也许我所知道的是我找错了方向,但希望你们能帮我解决这个问题。首先是关于我的工作的一些信息: -在我的web应用程序中,我有两个模型:一对多关系中的项目和任务。 -项目有许多任务,任务属于项目 -任务不是嵌套的资源,因为用户需要能够查看所有当前任务,而不管它们是用于哪个项目。 -因此,routes.rb现在看起来是这样的: 资源:项目 资源:任务 在“项

大家好!刚刚加入了stack overflow,因为它在开始学习Ruby on Rails 3时是一个有用的资源

虽然我似乎找不到一个特别的答案,也许我所知道的是我找错了方向,但希望你们能帮我解决这个问题。首先是关于我的工作的一些信息:
-在我的web应用程序中,我有两个模型:一对多关系中的项目和任务。
-项目有许多任务,任务属于项目
-任务不是嵌套的资源,因为用户需要能够查看所有当前任务,而不管它们是用于哪个项目。
-因此,routes.rb现在看起来是这样的:
资源:项目
资源:任务

在“项目显示”视图中,我显示与该项目关联的任务列表。下面是指向的链接,用于创建类似“new btn”%>的新任务。链接将用户带到新视图以创建新任务。呈现的_表单视图以以下开头:

现在,我想我需要将项目id从project show视图传递到new task视图:但是,这就是我迷路的地方,可能有点混淆了

有人能给我指出正确的方向吗:也许可以找到一个资源,列出做这件事所涉及的所有步骤,或者甚至可以在这里提供一个过程中涉及的步骤的概要


非常感谢

有很多方法可以做到这一点。一个简单的方法是向链接中添加一个参数,并在控制器中使用它:

def new
  @task = Task.new(:project_id => params[:project_id])
end
@task.project_id = params[:project_id]
在你看来:

<%= link_to 'New Task', new_task_path(:project_id => @project.id), :class => "new-btn" %>

将项目ID从项目页面传递到新任务页面的一种方法是将其添加到url上的查询字符串中。示例HTML如下所示:

<a href="/tasks/new?project_id=123" class="new-btn">New Task</a>
然后在表单_for block中的视图中执行类似的操作(我对语法不是100%确定):


您可以创建嵌套路由,并且无论项目如何,仍然可以显示所有任务。只需确保稍后定义了任务资源,如

resources :projects do |p|
  resources :tasks
end
resources :tasks
现在,在项目索引或显示视图中,您可以创建类似

link_to 'New Task', new_project_task_path(project)
link_to 'New Task', new_project_task_path(task.project)
任务索引视图可能有点棘手。这一切都取决于您如何对这些任务进行排序。例如,如果按项目排序显示它们,则可以创建一个链接,如

link_to 'New Task', new_project_task_path(project)
link_to 'New Task', new_project_task_path(task.project)
至于表格。在新操作中,您必须从params获取id并将其放入任务对象中

if (params[:project_id])
  @task.project_id = params[:project_id]
在表单视图中,您可以创建隐藏字段来保存此值

f.hidden :project_id
这将使它工作,但如果不提供项目,您将无法进入新任务。更好的解决方案是创建一个包含所有项目的select字段。要实现这一目标,您应执行以下操作:

在models/project.rb中

def getProjectsList
  projects = Project.all
  projects.map do |p|
    [project.name, project_id]
  end
end
在controllers/application_controller.rb中

def find_projects
  @projects = Project.new.getProjectsList
end
在控制器/任务\u controller.rb的开头

before_filter :find_projects, :only => [:new, :edit, :update, :create]
以视图/任务/_形式

f.select :project_id, @projects

通过这种方式,您可以始终选择项目,如果参数中给出了一个项目,那么它将已经被选中!感谢所有伟大的信息家伙!我确实学到了一些巧妙的技巧

以下是我现在的工作内容:

routes.rb

resources :projects do |p| resources :tasks end resources :tasks
<%= link_to 'New Task', new_project_task_path(@project), :class => "new-btn" %>
if (params[:project_id])
      @task.project_id = params[:project_id]
    end
<%= f.hidden_field :project_id %>
@projects = Project.find_all_by_user_id(current_user)
@tasks = Array.new
@projects.each do |p|
    p.tasks.each do |t|
        @tasks << t
    end
end

新任务表单隐藏字段

resources :projects do |p| resources :tasks end resources :tasks
<%= link_to 'New Task', new_project_task_path(@project), :class => "new-btn" %>
if (params[:project_id])
      @task.project_id = params[:project_id]
    end
<%= f.hidden_field :project_id %>
@projects = Project.find_all_by_user_id(current_user)
@tasks = Array.new
@projects.each do |p|
    p.tasks.each do |t|
        @tasks << t
    end
end

如果当前用户返回用户对象,那么您应该能够调用

current_user.projects 
获取所有用户的项目

定义用户和任务之间的关系可能会起作用(尽管我不确定这一点)

在这种情况下,简单地说

current_user.tasks 

应该返回用户的任务

太好了!我所要做的就是定义新的HMT关系和当前的用户。任务工作正常,就像你说的。再次感谢!