8

特定の AJAX 要求が与えられたときにフォーム要素を動的に作成しようとしています。

これは私のセットアップです:

意見:

    <%= link_to 'Next', check_unique_id_students_path, :remote => true %>

    <div id="guardian_student_details"></div>

コントローラ:

def check_unique_id
    @student = Student.new
    @this_form = ActionView::Helpers::FormBuilder.new(:student, @student, @template, {}, proc{})
  end

JS:

jQuery("#guardian_student_details").html("<%=escape_javascript(render :partial => "student_details", :locals => { :s => @this_form }) %>");

部分的:

<% puts s.text_field :first_name   %>
<% puts s.field_helpers   %>

デバッグの目的で、パーシャルの最初に次の行を配置しました。

<% puts s.class.to_s %>
<% puts s.object.to_s %>

これは出力します:

ActionView::Helpers::FormBuilder
Student

これはうまくいくはずです。ただし、レールは次のエラーを出しています:

ActionView::Template::Error (undefined method `text_field' for nil:NilClass):
1: <% puts s.class.to_s   %>
2: <p>
3: <%= s.text_field :first_name, :class => 'text_input is_empty' %>
4: <%= s.label :first_name %><strong>*</strong> 
5: </p>
6: 

app/views/students/_student_details.html.erb:3: _app_views_students__student_details_html_erb__2485891544130782916_2214680440' app/views/students/check_unique_id.js.erb:2:inin_app_views_students_check_unique_id_js_erb__3504800328150418937_2214933160'

これは、「s」が2行前に確認したNILであることを意味します。誰にもアイデアはありますか?これがコントローラーで初期化された「@template」変数と関係があるかどうかはわかりません。私が遊んで、事実上何でも受け入れ、印刷された場合はゼロです。どんな助けでも大歓迎です。ありがとう

最後の注意:

私はこれを実装しようとしました:accepts_nested_attributes_for partialsのAJAX更新

4

3 に答える 3

5

コントローラーでフォームビルダーを構築する必要がある人にとって、view_context は引き続きそこで機能します。Rails 4.1.4 の使用:

@object = Object.new
@f = ActionView::Helpers::FormBuilder.new(:object, @object, view_context, {})
于 2014-11-02T07:13:05.020 に答える
4

ビューでは、'view_context' が Rails 3.1 で機能しないことがわかりました。代わりに、FormBuilder オブジェクトを作成するときに「self」を試してください。

s = ActionView::Helpers::FormBuilder.new(:student, @student, self, {}, proc{})

于 2011-09-14T16:53:50.957 に答える
0

コンソールでこれを試してください:

s = ActionView::Helpers::FormBuilder.new(:student, @student, @template, {}, proc{})
s.text_field :first_name

同じエラーが発生します。正確な間違いがわからない場合でも、問題は form_builder オブジェクトの作成にあると思います...

あなたの解決策は少し複雑に思えます。この解決策を試すことができます:

#html.erb
<% form_for @student do |f| %>
  <div id='guardian_student_details' class='hide-this-block'>
    <%= render :partial => "student_details", :locals => { :s => f }) %>
  </div>
<% end %>

#js
jQuery("#guardian_student_details").show();

一般的に、私は JavaScript と Ruby を分けておくことを好みます。

于 2011-09-01T19:28:33.297 に答える