6

私のアプリには、ユーザーが「会場」を選択するための選択ボックスがあります。この選択ボックスは、ご想像のとおり、フォームになっています。ページのどこかに、AJAX を介して新しい会場を作成するアクションもあります。新しい会場が作成されたら、これを反映するように会場選択ボックスを更新したいと思います。

私の解決策は、選択ボックスをパーシャルに配置し、コントローラーの作成アクションからパーシャルをレンダリングすることでした。

 <div id="venue_select" style="clear: both;">
    <%= render :partial => 'venue/venue_select_box' %>
 </div>

パーシャルは次のようになります。

<%= f.collection_select :venue_id, @user_venues, :id, :name, :prompt => 'Select a venue' %>

ここで、f はフォーム参照です。

<% form_for :shows do |f| %>

問題は、パーシャルで f が定義されていないため、エラーが発生することです。1 つの解決策は、フォーム全体を含めることですが、フォーム全体を更新するわけではないので、その必要はないと思います。これをどうやって進めるかについてのアイデアはありますか?

4

5 に答える 5

8

次のように、パーシャルに変数を渡すことができます。

  <%= render :partial => 'venue/venue_select_box', :locals => { :f => f } %>

このようなものについては、ドキュメントを参照することをお勧めします

編集: AJAX リクエストでパーシャルを使用するには、.rjs テンプレートでフォームを「再作成」する必要があります。そのため、コントローラーでオブジェクトを再度見つける必要があります。

 def venue_select
    @venue = Venue.find(params[:id])
    respond_to do |format|
      format.html
      format.js
    end
 end

次に、venue/venue_select.rjs ファイルで:

 form_for @venue do |f|
   page[:element].replace_html :partial => 'venue/venue_select_box', :locals => { :f => f }
 end

:element置換する選択メニューの ID はどこにありますか。基本的に、form_for を再作成し、それを使用して選択フィールドを更新するだけです。

于 2009-04-07T03:36:46.370 に答える
1

onCompleteAJAX addのフックとして、Javascriptを使用して選択ボックスに会場を追加する方が簡単な場合があります。

于 2009-04-07T18:13:38.057 に答える
1

AJAX 呼び出しが追加された会場の JSON 表現を返し、新しいオプションを作成して select 要素に追加する場合は、これについて Sarah Mei に同意します。

選択オプションを追加するための一般的な JS コード:

var newOption = new Option("Text", "Value");
selectElement.options[selectElement.options.length] = newOption;
于 2009-04-08T12:50:24.597 に答える
0

あなたの解決策は悪くないと思いますが、このパーシャルを別の形式で使用しようとすると、生成されるフィールドの名前に問題があります。

これを回避するには、ajax 呼び出し内で f.object_name の内容を送信します。あなたの場合、それは「shows」になり、メソッドが:venue_idであるため、生成された名前は「shows [venue_id]」になります。

于 2013-11-19T23:10:30.417 に答える
0

これらはすべて素晴らしいオプションですが、私は最も簡単だと思います。基本的に、collection_select に名前をハードコーディングしただけなので、「f」変数は必要ありません。

<%= collection_select 'shows[venue_id]', :venue_id, @user_venues, :id, :name, { :prompt => 'Select one of your previous venues' } %>

次に、私の VenueController は次のとおりです。

class VenueController < ApplicationController
  layout 'main'
  before_filter :login_required, :get_user

  def create
    begin
      venue = @user.venues.create(params[:venue])
      @user_venues = @user.venues
      render :partial => 'venue_select_box', :success => true, :status => :ok
    rescue ActiveRecord::RecordInvalid => invalid
      flash[:errors] = invalid.record.errors
      render :text => '', :success => false, :status => :unprocessable_entity
    end
  end

end

何らかの理由でこの方法が悪い方法である場合は、お知らせください。喜んでお答えいたします。

于 2009-04-08T16:16:46.287 に答える