3

我确定我遗漏了一些简单的东西,但不知道 Rails 中的正确术语,我找不到我要找的东西....

一个Project模型 has_manyTask和一个Taskbelongs_to a Project

我的routes.rb

resources :projects
resources :tasks

Projects我可以很好地创建/编辑/修改,我也可以编辑Tasks......但我似乎无法弄清楚如何创建一个新的,在这样做时Task分配正确的。Project

我的Project页面(例如 /projects/2)有一个添加任务链接,该链接指向 /task/new,所以我失去了连接。我不想创建一个嵌套资源,因为Tasks一旦创建,它们的 ID 将是唯一可识别的,并且在未来 has_many 其他模型也是如此。

这里有快速修复吗?

编辑好吧,我已经设法解决了这个问题....它很丑而且很可怕,我不确定为什么必须这样,但它确实有效。

我的路线:

resources :projects do
  resources :tasks, :only => [:new]
end

resources :tasks, :except => [:new]

我的任务控制器:

def new
  @project = Project.find(params[:project_id])
  @task = @project.tasks.build
end

# Process the form for creating a new task.
def create
  @project = Project.find(params[:task][:project_id])
  @task = @project.tasks.build(params[:task])
  if @task.save
    flash[:success] = 'Task created.'
    redirect_to project_path(@project)
  else
    render 'new'
  end
end

还有我的任务表:

<%= semantic_form_for @task do |f| %>

<%= render 'shared/form_message', :object => f.object %>

<%= f.inputs do %>
    <%= f.input :name %>
    <%= f.input :project %>
<% end %>

<ul class="formActions">
    <li class="list"><%= link_to 'Back to list', project_path(@task.project) %></li>
    <li><%= f.submit "Save" %></li>
</ul>

<% end %>

我不想将项目框放在表单上,​​我仍然不确定为什么必须这样做,以及为什么需要将 :create排除在嵌套路由之外。对于如此常见的任务,这似乎也很费力,但它确实有效,所以....我想这一切都很好。

4

2 回答 2

2

确保在新任务操作中通过项目构建新任务,以便它带有已分配的项目 ID。这应该使您的表单生成器表现良好并做正确的事情。

TasksController < AplicationController
  before_filter :get_project
  …
  def new
    @task = @project.tasks.build # don't use @task = Task.new here!
  end
  …
  def get_project
    @project = Project.find(params[:project_id])
  end
end

当然,强烈建议使用嵌套路由。

resources :projects do
  resources :tasks
end
于 2011-01-16T12:06:15.177 回答
1

听起来您想要的是仅用于创建任务的嵌套路由。

resources :projects do
  resources :tasks, :only=>[:new, :create]
end
resources :tasks, :except=>[:new, :create]

编辑:这是您的代码的修订版本,应该更简洁一些。从edgerunner借一点。

任务控制器:

before_filter :get_project

def new
  @task = Task.new
end

# Process the form for creating a new task.
def create
  @task = Task.new params[:task]
  @task.project_id = params[:project_id]
  if @task.save
    flash[:success] = 'Task created.'
    redirect_to project_path(@task.project_id)
  else
    render 'new'
  end
end

private

def get_project
  @project = Project.find(params[:project_id])
end

和任务形式:

<%= form_for [@project, @task] do |f| %>

  <%= render 'shared/form_message', :object => f.object %>

  <%= f.inputs do %>
    <%= f.input :name %>
  <% end %>

  <ul class="formActions">
    <li class="list"><%= link_to 'Back to list', project_path(@task.project) %></li>
    <li><%= f.submit "Save" %></li>
  </ul>

<% end %>
于 2011-01-16T03:00:04.807 回答