6

私は一見非常に単純に見えるものを実装しようとしていますが、この時点で何日も頭を悩ませてきました。

私の望む最終結果は、州選択ドロップダウンに関連付けられた国選択ドロップダウンです。これにより、特定の国が選択されたときに、IF 州が既知であり、それらの州が選択ドロップダウンに表示されます。その国の州が不明な場合は、代わりにテキスト フィールドが表示されます。

私はほとんどそこにいるような気がします。この時点で、ドロップダウンを動的に更新することを拒否している場合を除いて、インターフェイスは実際にその人の国に基づいて州のリストを生成します。

国と州の場所が収集されるビューの部分は次のようになります。

# _person_setup.html.erb
         <td>
        <%= f.label :country, 'Select your country' %>*<br />
        <%= f.select :country, Carmen::country_names, {}, 
          {:style => 'width: 200px', 
          :id => 'country_select',
          :onchange => remote_function(
            :url => {:action => 'update_states'},
            :with => "'country='+value")} %>            
      </td><td>
        <p>
        <div id="states_div">
            <%= render :partial => 'states', 
                :object => Carmen::states(
                            Carmen::country_code(
                              @person.country)),
                :locals => {:form => f} %>
       </div>
        </p>            
      </td>    

DIV で参照されているパーシャルは次のとおりです。

 # _states.html.erb
<% unless states.nil? or states.empty? %>
    <%= form.label :state, 'Select your state' %>*<br />
    <%= form.select :state, states.collect{|s| [s[0], s[0]]} %>
<% else %>
    <%= form.label :state, 'Please enter state or province' %>*<br />
    <%= form.text_field :state %>
<% end %>

最後に、状態のリストを動的に更新するためのコントローラー コード:

def update_states    
puts "Attempting to update states..."    
q = params[:country]    
states = Carmen::states(Carmen::country_code(q))
puts "Country = #{q}, states = #{states.collect{|s| s[0]}.join(", ")}."
render :update do |page|
    page.replace_html "states_div", 
      :partial => 'states',
      :object => states,
      :locals => {:form => form_for(@person)}
end
puts "OK"
end

現在、このコードは適切なタイミングで呼び出され、適切な状態のリストを生成しています。たとえば、ユーザーがオーストラリアをクリックすると、「州を更新しようとしています... 国 = オーストラリア、州 = オーストラリア首都特別地域、ニュー サウス ウェールズ、ノーザン テリトリー、クイーンズランド、南オーストラリア、タスマニア、ビクトリア、西オーストラリア」と表示されます。サーバープロセス。ただし、ページは更新されず、最後に「OK」は出力されません。要するに、失敗している行は間違いなく

page.replace_html "states_div", 
      :partial => 'states',
      :object => states,
      :locals => {:form => form_for(@person)}

この行を

page.replace_html 'states_div', "<b>is it working</b>" 

divを適切に置き換えますが、もちろん有用なものではありません。

誰かがここで何が起こっているのかを理解するのを手伝ってくれますか?

4

3 に答える 3

1

Ryan Bates は、製品のカテゴリを選択する方法、または名前を入力して新しいカテゴリを作成する方法を示す Railscast を持っています。あなたが持っているものと同様のシナリオのように聞こえるので、チェックアウトすることをお勧めします: Create Model Through Text Field

于 2009-06-10T15:18:42.837 に答える
1

元のアクションから @person 変数がまだ利用可能であると想定しているようです。これは、現在の人のフィルターによって設定できますが、質問には表示されません。

@person を再度検索する必要がある場合は、remote_function で ID を渡す必要があると思います。

于 2009-06-10T15:31:25.540 に答える
0

これは、少なくとも「機能する」何かを理解するのに丸一日かかりました。また、Carmenを使用しており、form_forモデルフォームのselectタグをいじっています(実際には、fields_forはforms_for ...内にネストされているため、さらに複雑になります)。

もっと良い解決策があると思いますが、これは私にとってはうまくいきました。選択はフォームによって参照される必要がありますが、オプションは参照されません。したがって、最初は、選択タグとすべてのネストされたオプションタグを正しく設定するCarmenstate_selectメソッドを使用します。2回目は、オプションを置き換えるだけです。見てください:

ビューでは、状態を更新する以外に他のことを行うため(他のローカリゼーションの変更)、observe_fieldメソッドを使用することを選択しましたが、これはremote_functionなどでも機能するはずです。

<%= address_form.country_select :country, {:prompt => "--Select One--"} %>

id(user_address_attributes_country)と混同しないでください。これは私のばかげたforms_for / fields_forの実装です)

<%= observe_field :user_address_attributes_country, :url => { :action => :changecountry }, :with => 'new_country' %>

<%= address_form.state_select :state, @user.address.country, {:prompt => "--Select One--"}, :style => 'width: 90px' %>

次に、私のコントローラーでは、次のようになります。

def changecountry
  c = params[:new_country]

  respond_to do |format|
    format.html
    format.js {
      render :update do |page|
        page['user_address_attributes_state'].innerHTML = \
          "<option>--Select One--</option>" + state_options_for_select(nil, c)
      end
    }
  end
end

注:state_options_for_selectこれもカルメンからのものです。ビューヘルパーが利用可能であると推測されるrespond_toブロック内に配置しない限り、機能させることができませんでした。user_address_attributes_stateまた、ビューのform_for /fields_foraddress_form.state_selectレンダリング呼び出しから生成されたネストされたIDであるハードコードを作成します。

これがお役に立てば幸いです。誰かがそれをもっとうまくやれるなら、私を信じてください、私はすべての耳です。私は時間内にデザインを変更します...しかし、今日ちょうどうまくいく何かが必要でした、そしてこれは私が限られた時間で理解することができた最高でした。

于 2009-12-07T06:27:55.370 に答える