2

私はRailsの初心者で、明らかに簡単な作業に苦労しています。私は(簡素化された)フォームを持っています:

<%= form_for @order, html: { :class => 'form-inline' } do |f| %>
  <fieldset>
  <legend><%= params[:action].capitalize %> Order</legend>

  <table class="table">
    <thead>
      <tr>
        <th><%= f.label :symbol %></th>
        <th><%= f.label :price %></th>
      </tr>
    </thead>

    <tbody>
      <tr>
        <td><%= f.text_field :symbol, class: 'input-small' %></td>
        <td><%= f.text_field :price, class: 'input-small' %></td>
      </tr>
    </tbody>
  </table>

  <div id='here'></div>

  <%= f.submit "Submit", class: "btn btn-primary" %>

  </fieldset>
<% end %>

<%= link_to 'Get quote', view_quote_orders_path, remote: true %>

「見積もりを取得」をクリックしてシンボルテキストフィールドがフォーカスを失ったときに、div $(#here) の Google Finance で見積もりをレンダリングしたいと考えています。Rubyで引用を抽出するコードをすでに書いています。

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

  resources :orders do
    get 'view_quote', on: :collection
  end

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

def view_quote
  respond_to do |format|
    format.js { render :layout => false }
  end
end

そしてview_quote.js.erbで:

sym = $('.orders #order_symbol').val();
$('#quotes').html("<%=j render 'googlequote', symbol: sym %>");

そして _googlequote.html.erb (引用を抽出するロジックを配置します):

<%= symbol %>

sym が定義されていないため、エラーは view_quote.js.erb にあります。2行目を次のように置き換えると:

$('#quotes').html("<%=j render 'googlequote', symbol: 'just_a_test' %>");

パーシャルはレンダリングされますが、もちろん必要ありません。javascript 変数 sym を部分的な _googlequote.html.erb に渡すにはどうすればよいですか? そうでなければ、私の目的を達成するためのより良い方法はありますか?

4

3 に答える 3

3

erb はサーバー上でレンダリングされるため、erb に入れることはできません。これを実現する 1 つの方法は、シンボルを のパラメータとして使用するview_quoteことです。したがって、次のようなものを作成できます。

$('#quotes').html("<%=j render 'googlequote', symbol: params[:sym] %>");

(もちろん、そのパラメータをより RESTful に結び付けることができますが、これは良い出発点です)。

于 2013-02-01T00:02:32.030 に答える
1

@ ben-taitelbaumと@ajcodezに感謝します。最終的には、この優れた記事の例4とRyanonRailsのコメントで提案されている、別のアプローチを使用しました。

このように、シンボルフィールド変更イベントをキャプチャした後、シンボルはコントローラーに渡され、そこでロジック(google Financeからの見積もりをスクレイピング)が実装されます。結果は、レイアウトに挿入するためにjson形式でjavascriptに再度渡されます。

于 2013-02-04T15:47:05.220 に答える
1

Orders コレクションに対して GET リクエストを行っています。つまり、それらすべてです。注文モデルのシンボルを使用したい場合は、メンバーにリクエストを行います。

それ以外の場合は、パラメーターとして渡すことができます (あなたがやろうとしていると思います)。変更するたびにサーバーに渡したい場合は、jQuerychangeメソッドをお勧めします。次に、ajax リクエストを作成できます。

$.get('/orders', { sym: $('.orders #order_symbol').val() }, function(response) {
   $('#here').html(response);
});

そしてコントローラーで:

def view_quote
  @sym = params[:sym]
  # use @sym in rendering partial
end
于 2013-02-01T00:11:18.610 に答える