2009-12-25 4 views
2

С функцией 2.3.x + rails для вложенных моделей, я думаю, мне нужно иметь доступ к экземпляру компоновщика форм, чтобы правильно специфицировать частичные части для рендеринга вложенных моделей. Натяжение от комплекса-форм-примеров:тестирование (rspec) вложенные партитуры модели в rails 2.3+

Например, здесь форма вшита, которая создает и передает форму строитель к вложенному зрению модели рендеринга:

<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> 

Когда я пытаюсь спецификации частично, как это, я попытался поймать вид строитель как экземпляр вар, выполнив:

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) спецификации вложенных моделей и их форм представления?

Это важно для правильного создания имени.

+0

Вы должны принять ответ pr0d1r2, он работал большой для меня. –

ответ

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 
Смежные вопросы