1

ネストされたモデル、Projectに属するTaskがあるので、モデルには次のようになります。

class Task < ActiveRecord::Base
  belongs_to :project
  validates :project_id, :presence => true

私のプロジェクトモデルでは、次のようになっています。

class Project < ActiveRecord::Base
  has_many :tasks, :dependent => :destroy

これで、ユーザーがproject_id、つまりタスクが属するプロジェクトを指定できる新しいタスクを作成するためのフォームができました。したがって、私のフォームは次のようになります。

    <%= form_for [@project, @task], :remote => true do |f| %>
        <%= f.label :title, "Title" %>
        <%= f.text_field :title %>
        <%= label_tag("Project") %>
        <%= select(nil, :project_id, (get_active_projects).collect {|p| [p.title, p.id]  }, {:prompt => 'Select Project'}) %>

        <%= f.label :description %>
        <%= f.text_area :description %>

       <div class="actions">
       <%= f.submit 'Save' %>
       </div>
    <% end %>

検証で私が抱えている問題は、ユーザーがフォームでプロジェクト(project_id)を選択しなかった場合、検証を正しく行う前にプロジェクトが見つからないというエラーが表示されることです。プロジェクトを見つけようとするに、project_idの存在を強制する検証を実行したいと思います。

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

    @task = @project.tasks.new(params[:task])
    @task.update_attributes(:status_id => 2)
    @task.save!
4

1 に答える 1

1

メソッドでプロジェクトを見つけようとすると、project_idがnilの場合、そのエラーが発生します。has_manyとbelongs_toの関係であるため、project_idをタスクに保存するのに十分であるため、プロジェクトを介してタスクを作成する必要はありません。タスクを作成しているので、form_forのプロジェクトオブジェクトは必要ありません。次のように実行できます。

<%= form_for @task, :remote => true do |f| %>
    <%= error_messages_for(@task) %>
    <%= f.label :title, "Title" %>
    <%= f.text_field :title %>
    <%= f.label :project_id %>
    <%= f.select(nil, :project_id, (get_active_projects).collect {|p| [p.title, p.id]  }, {:prompt => 'Select Project'}) %>  (just check the select syntax if i did something wrong)

    <%= f.label :description %>
    <%= f.text_area :description %>

    <div class="actions">
        <%= f.submit 'Save' %>
    </div>
<% end %>

次に、コントローラーのメソッドはこれと同じくらい単純である必要があります

def create
    params[:task][:status_id] = 2
    @task = Task.new(params[:task])
    if @task.save!
       what you want to do if valid
    else
       go back to same page with errors
    end
end
于 2012-05-25T02:30:06.017 に答える