3

簡単なものが欠けていると確信していますが、Rails の正しい用語を認識していないため、探しているものが見つかりません....

Projectモデル has_many 、TaskおよびTaskbelongs_to Project.

私のroutes.rb持っている

resources :projects
resources :tasks

私は問題なく作成/編集/変更Projectsでき、編集もできTasksます...しかし、新しい を作成する方法がわかりません。そうするときTaskに正しいを割り当てます。Project

私のProjectページ (例: /projects/2) には、/task/new に移動する [Add Task] リンクがあるため、接続が失われています。ネストされたリソースを作成したくありません。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

IT sounds like what you want is a nested route for creating tasks only.

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

EDIT: Here's a revised version of your code that should be a bit cleaner. With a little borrowing from edgerunner.

Task controller:

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

And the Task form:

<%= 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 に答える