2

ネストされたモデルの 2.3.x+ rails 機能では、フォーム ビルダー インスタンスにアクセスして、ネストされたモデルをレンダリングするためのパーシャルを適切に指定する必要があると思います。complex-forms-examples からプル:

たとえば、フォーム ビルダーを作成して、ネストされたモデル レンダリング ビューに渡す、囲みフォームを次に示します。

<div class="children_fields tasks" id="<%= dom_id(f.object) %>_tasks"  
   data-context="<%= f.object_name %>">
  <% f.fields_for :tasks do |task_form| %>
    <%= render :partial => 'task', :locals => { :f => task_form } %>
  <% end %>    
</div>

部分的なタスクは次のとおりです。

<%= f.label :name, "Task" %>
<%= f.text_field :name %>
<%= remove_child_link "remove", '#', f %>
<div class="children_fields assignments" id="<%= dom_id(f.object) %>_assignments"  
     data-context="<%= f.object_name %>">
  <% f.fields_for :assignments do |assignment_form| %>
    <%= render :partial => 'assignment', :locals => { :f => assignment_form } %>
  <% end %>
</div>

このようなパーシャルを指定しようとすると、次のようにして、フォーム ビルダーをインスタンス var としてキャッチしようとしました。

before(:each) do
  ... # setup for target object
  form_for [:foo, :bar, @project] do |f|
    @f = f
  end
end

これにより、form_for の使用時にエラーが発生します

undefined method `polymorphic_path' for #<Spec::Rails::Example::ViewExampleGroup::Subclass_1:0x2cfeafc>
/Users/adamaig/.rvm/gems/ruby/1.8.7/gems/actionpack-2.3.5/lib/action_controller/test_process.rb:511:in `method_missing'
/Users/adamaig/.rvm/gems/ruby/1.8.7/gems/actionpack-2.3.5/lib/action_view/helpers/form_helper.rb:298:in `apply_form_for_options!'
/Users/adamaig/.rvm/gems/ruby/1.8.7/gems/actionpack-2.3.5/lib/action_view/helpers/form_helper.rb:272:in `form_for'

では、次の正しい方法は何ですか: 1) このような仕様の FormBuilder インスタンスを取得しますか? 2) ネストされたモデルとそのビュー フォームを指定しますか?

これは、適切な名前の生成にとって重要です。

4

1 に答える 1

3

解決策は次のとおりです。

describe 'tasks/_form' do
  attr_accessor :output_buffer

  before do
    task = mock_model(Task, :mumbo_jumbo => 'foo bar')
    @output_buffer = ''
    form_for(task, :url => task_path(task)) do |f|
      @f = f
    end
  end

  it 'should have input mumbo_jumbo' do
    render_partial_with_locals
    response.should have_tag('input[name=?]', 'task[mumbo_jumbo]')
  end

  private

    def render_partial_with_locals
      render :partial => 'tasks/form', :locals => {:f => @f}
    end

    def protect_against_forgery?
      false
    end
end
于 2010-06-16T09:22:48.987 に答える