3

Spree 管理ビューの 1 つに既に存在するフォームに入力を追加しようとしています。オーバーライド テキストは次のとおりです (表示中心でノイズの多い部分を切り取りました)。

new_html = "
  <div id='neato_new_field'>
    <p id='product_display_value'>
      <label for='display_value'>Display Value</label>
      <br>
      <input type='text' name='product[display_value]' size='30' id='product_display_value' value=''>
    </p>
  </div>"

Deface::Override.new(:virtual_path  => "spree/admin/products/_form",
                     :insert_after => "div.clearfix",
                     :text          => new_html,
                     :name          => "add_display_value")

方法を知る必要があるのは、入力の「値」プロパティの値を設定して、このビューがレンダリングされるときにそのオブジェクトに現在あるものを取得することです。

そこに value='#{@product.display_value}' を入れてみましたが、@product が nil であると不平を言っています。そのような補間を使用して、display_value を取得することはできますか? この改ざんは、コントローラーがレンダリングを試みる前または後に行われますか?

これにどう対処するか、今考え中です。既にある html から製品 ID をすくい取り、それを使用して製品をロードし、その値をそこに入れる必要がありますか? これを解決するのが簡単な問題にする基本的な何かが欠けていることを本当に望んでいます:P それはSpreeのカスタマイズの多くに当てはまります-最初はどうすればよいのかわかりませんが、いったん理解すると私のカスタマイズを実装するのはとても簡単です...

ありがとう、jd

4

1 に答える 1

5

私がそれを理解した後、答えはかなり簡単でした。

:text => をいくつかのランダムな html マークアップに使用する代わりに、結果として、どのテンプレート ビューでも得られるすべての適切な動作 (特にスコープ内の変数) が得られるパーシャルを指摘しました。

最終的な解決策は次のようになります。

Deface::Override.new(:virtual_path => "spree/admin/products/_form",
                     :insert_after => "div.clearfix",
                     :partial      => "partials/admin",
                     :name         => "add_display_value")

そして部分:

<div>
  <%= f.field_container :display_value do %>
    <%= f.label :display_value, t(:display_value) %>
    <br>
    <%= f.text_field :display_value, :size => 30, :value => @product.display_value %>
  <% end %>
<div>
于 2012-12-10T00:36:24.840 に答える