Ruby on rails 3 Rails 3为特定的父级创建新的子级
大家好!刚刚加入了stack overflow,因为它在开始学习Ruby on 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现在看起来是这样的: 资源:项目 资源:任务 在“项
-在我的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关系和当前的用户。任务工作正常,就像你说的。再次感谢!