0

Ruby on Rails の初心者で、混乱してイライラしています :) 私はこれに 1 日以上費やしましたが、おそらく自分自身を混乱させただけだと思います。

基本的に、ビューでパーシャルをレンダリングしようとしています。ここに私が具体的に持っているものがあります: 2 つの基本フィールドを持つフォーム: カテゴリとサブカテゴリ。SubCategory は、ユーザーが Category で選択したものに応じて変化します。アセット パイプラインを有効にして「JQuery」を使用しています。この部分は機能します:

 
    contact_infos.js.coffee

    jQuery(document).ready(->
        $("select#contact_info_category_id").change(->
          id_value_string = $(@).val()
          if id_value_string == ""
            # if the id is empty remove all the sub_selection options from being selectable     and do not do any ajax
            $("select#contact_info_subcategory_id option").remove()
            row = "" + "" + ""
            $(row).appendTo("select#contact_info_subcategory_id")
          else
            # Send the request and update sub category dropdown
            tmp = '/subcategories/for_categoryid/' + id_value_string + '.json'
          $.ajax(
            type: 'GET',
            dataType: 'json',
            url: tmp,
            timeout: 2000,
            error: (XMLHttpRequest, errorTextStatus, error) -> alert "Failed to submit : " + errorTextStatus + " ;" + error,
              success: (data) ->
                # Clear all options from sub category select
                $("select#contact_info_subcategory_id option").remove()
                # put in a empty default line
                row = "" + "" + ""
                $(row).appendTo("select#contact_info_subcategory_id")
                # Fill sub category select
                $.each(data, (i, j) ->
                  row = "" + j.name + ""
                  $(row).appendTo("select#contact_info_subcategory_id")
                )
          )
        )
      )
    

json 応答を正しく生成します。

フォームが読み込まれると、Category と SubCategory に加えて、2 つのテキスト フィールド (previous_value と current_value) も表示されます。ただし、SubCategory == "Full" の場合は、previous_value と current_value を非表示にし、新しいフィールドでパーシャルを挿入する必要があります。

JQuery で previous_value フィールドと current_value フィールドを非表示にしても問題はありませんが、次のようになります (これは上記のコードに挿入されています)。

$("select#contact_info_subcategory_id").change(->
    id_text_string = $("#contact_info_subcategory_id option:selected").text()
    if id_text_string == "Full"
      $('#contact_info_previous_value_id').hide()
      $('#contact_info_current_value_id').hide()
    else
      $('#contact_info_previous_value_id').show()
      $('#contact_info_current_value_id').show()
  )

SubCategory が「Full」の場合に新しいフィールドを挿入するフォームに「test」という div を作成しました。もちろん、この行を contact_infos.js.coffee に挿入しても機能しません。

  $('#test').html('<%= escape_javascript render("contact_infos/_full_name_info") %>')

ページに表示されるのは文字列 "<%= escape_javascript render("contact_infos/_full_name_info") %>" だけです

次のことを試しましたが、何も動作しません:
1. 次のコードで new.json.erb ファイルを作成します:

<% self.formats = ["html"] %>
      test = {
        "html":"<%= raw escape_javascript(render :partial =>     'contact_infos/full_name_info',
                    :content_type => 'text/html')} 
                %>"
      }

この json ファイルはトリガーされませんでした。私のコントローラーには次の行があります:

format.json { render json: @contact_info }

これはこれを行うための最良の方法ですか?はいの場合、次に何を試すことができますか?


2. 昨日、application.html.erb レイアウト ファイルに JavaScript 変数 (fullnamefield と呼びました) を作成し、js 変数を私がした new.html.erb ビュー。また、contacts_infos.js.coffee に次の行を追加しました。

('#test').html(fullnamefield) 

そしてそれは働いた!! それを除いて、サイトの他の領域に行ったときにエラーが発生しました.
3. 回避策として、jquery が生成する json を js に変更してから、new.js.erb をトリガーしようと考えました。ajax 呼び出しを変換しようとして問題が発生しました。「json」と「text」のデータタイプを作成できましたが、スクリプトは作成できませんでした(理由はわかりません)。

それで...アイデア/助けはありますか?私は本当に検索してきましたが、JQueryから必要に応じてすべてのフィールドと非表示を作成/表示することを検討しているだけで十分にイライラしています。これは実装が非常に簡単ですが、間違っています.

更新:試行 4 (または 40 ですか?):

あなたが書いたことを考えさせられました... 私は近づいていると思いますが、まだそこにはいません.

_form.html.erb で、サブカテゴリ フィールド data-remote、data-url、および data-type に追加しました。

<div class="field">
      <%= f.label :category_id %>
      <br/>
      <%= collection_select(:contact_info, :category_id, Category.all, :id, :name, options ={:prompt => "--Select a Category--"}) %>
    </div>
    <div class="field">
      <%= f.label :subcategory_id %>
      <br/>
      <%= collection_select(:contact_info, :subcategory_id, Subcategory.find_all_by_category_id(@contact_info.category_id), :id, :name, options ={:prompt => "--Select a SubCategory"}, "data-remote" => true, "data-url" => "/contact_infos/get_full_fields", "data-type" => :json ) %>
    </div>

次に contact_infos_controller.rb に以下を追加しました:

def get_full_fields
    @full_name = FullName.new
    respond_to do |format|
      format.js
    end
  end

私の routes.rb で、コレクションを追加して contact_infos を変更しました...

    resources :contact_infos do
        collection do
          get 'get_full_fields'
        end
      end

contact_infos\get_full_fields.js.erb を作成しました:

var full_fields_form = $('<%= j(render(:partial => "contact_infos/full_name_info"))%>');
$('#test').html(full_fields_form);

デバッガーを使用してブラウザーでこれをテストし、SubCategory を "Full" に変更すると、正しく動作することがわかります (と思います)。

リクエスト URL:http://localhost:3000/contact_infos/get_full_fields?contact_info%5Bsubcategory_id%5D=3 リクエスト方法:GET ステータス コード:200 OK

「タイプ」は「text/javascript」と表示されています。[応答] タブには JavaScript コードが表示されているだけですが、何も起こっていません/トリガーされていません。だけ置いても

alert('hello');

js ファイルでは何も起こりません。

理由はありますか?

4

1 に答える 1