0

ユーザー入力を必要とする小さなウィンドウを作成するために、link_to で目立たない Javascript を使用する Rails 3 アプリケーションがあります。元のボタンは次のとおりです (クライアントが猫を追加する場合):

<%= link_to "New Cat", new_client_cat_path(@client), :remote => true, :class => "btn btn-primary btn-large" %>

app/controllers/cats_controller.rb:

def new
  @cat = @client.cats.build
  @submit_label = "Create"
  respond_to do |format|
    format.html
    format.js { }
  end
end

app/views/cats/new.js.erb:

$('#<%= dom_id(@cat) %> .details').html('<%= escape_javascript render("new") %>');

app/views/cats/_new.html.erb:

<h2>New Cat</h2>
<%= form_for [@client, @cat] do |f| %>
<%= f.error_messages %>
<%= f.submit @submit_label, :class => "btn btn-primary btn-large" %>
<% end %>
<%= link_to "Cancel", @client, :class => "btn btn-primary btn-large" %>

私の問題は、レンダリングされた「新しい」ウィンドウが表示されないことです。ログ ファイルは、これらのページがレンダリングされたことを示しています。

Rendered cats/_new.html.erb (3.8ms)
Rendered cats/new.js.erb (5.4ms)

ユーザーが「New Cat」ボタンをクリックしたのと同じウィンドウに出力が表示されない理由を理解できるように、出力がどこにレンダリングされているかを知るにはどうすればよいですか?

4

1 に答える 1

0

render("new") を返しています。代わりに、おそらくパーシャルをレンダリングしたいと思うでしょう。したがって、新しいビューから実際のフォーム定義を抽出し、それらを部分的な「_new.html.erb」に入れます

したがって、 new.html.erb には次が含まれます

<%= render :partial=>'new' %>

そしてあなたのnew.js.erb:

$('#<%= dom_id(@cat) %> .details').html('<%= escape_javascript render(:partial=>"new") %>');

これであなたがやろうとしていることを完全に解決できるかどうかはまだわかりませんが、正しい方向に進むはずです. たとえば、返された HTML をどの要素に配置しますか? 既存の form_for で囲まれた要素である必要があります。あなたは多分これを行うことができます:

<%= form_tag  '/thing/create',  :html=>{:style=>'display:none'} do %>
  <div id='newform'>
    <%= render(:partial=>'new') %>
  </div>
<% end %>

それで:

$('#newform').html('<%= escape_javascript render(:partial=>"new") %>');
$('#newform').show;

このアプローチがこれを使用することを妨げることに注意してください:

<%= form_for @resource  do |f| %>
  <% f.text_field :foo %>
<% end %>

囲んでいる f ブロックをコントローラーに送信して、コントローラー アクションにパーシャルでこれを試して処理させることはできません。

<%= f.text_field :foo %>

したがって、次のことに頼る必要があります。

<%= form_tag .... do %>
  <%= render_partial=>'new' %>
<% end %>

そして _new.html.erb で

<%= text_field_tag , 'thing[foo]', @thing.foo %> 

コントローラーが AJAX 要求に応答して HTML を送り返すと、一般にブラウザーに向けられ、HTML 内に含まれているのは、ブラウザー ページのどの要素が影響を受けるかについての指示です。

たとえば、これを行うことができます:

render :js=>"$('#foobar').html('<h1>TITLE</h1><p>foobar</p>')";

またはこれ:

render :js=>"$('#barfoo').html('<h1>TITLE</h1><p>barfoo</p>')";

それぞれがページのさまざまな要素に影響します。

于 2012-11-05T18:26:50.703 に答える