4

更新3:

これを読んだ人にとって、これが以下のアップデート2で期待どおりに機能しなかった理由です。ビューがすでにロードされた後にレンダリングされるパーシャルにローカル変数を渡す

誰かがその問題を解決する方法を知っているなら、私に知らせてください。

更新2:

引用符でjavascriptを更新しましたが、部分的に機能します... javascriptが機能するようになり、部分的なものだけがある限り、リンクをクリックするとページにテキストの文字列が表示されるという意味でテキストの文字列が含まれています。ただし、パーシャルにフォームフィールドコードが含まれていると、問題が発生します。

次のレンダリングコードをnew.html.erbビューのフォームに直接貼り付けるだけで、新しいフォームセクションが適切に生成されます。

 <%= render "add_round", f: f %>

ただし、comps_helper.rbに同様のコードを含めて、link_toから参照しようとすると、機能しません。

comps_helper.rb内:

def addRound(f)
   render "add_round", f: f 
end

new.html.erbの場合:

 <%= link_to "render it!", addRoundLink_path, remote: true %>
 <div id="some_id"></div>

そして、addRoundLink.js.erbを次のように変更しました。

$("#some_id").html("<%=j addRound(f) %>");  #Is this the correct change to have made here?

その場合、link_toリンクをクリックしても何も起こりません。

何かご意見は?

更新されたコード:

返信いただきありがとうございます。次の変更を加えましたが、まだ機能していないようです。リンクはフォームの下部に表示されますが、クリックしても何も変更されません。私は何が欠けていますか?

ルート.rb:

resources :comps
match '/new_competition', :to => "comps#new" 
get "/addRoundLink" => "comps#addRoundLink", :as => :addRoundLink   

注:問題が発生する場合に備えて、「comps」に関連する他の2行を含めました。

comps_controller.rb:

def addRoundLink
  respond_to do |format|
    format.js
  end   
end

comps_helper.rb:

def addRound
  render "add_round"
end   

addRoundLink.js.erb:

$("#some_id").html(<%=j addRound %>);

comps / new.html.erb:

<%= link_to "render it!", addRoundLink_path, remote: true %>
<div id="some_id"></div>

ありがとう。

元の質問

まず、私はRailsを初めて使用します。私は同様の質問に対する多くの解決策を読んで試しましたが、これまでのところ何も機能していません。

railsform_forとfields_forでフォームを作成しました。フォームは新しい競争(comp)を作成します。競争には多くのラウンドがあります。フォームの上半分(form_forセクション)は入力として競技に関する詳細を受け入れ、フォームの下半分は各ラウンドに関する詳細(fields_forセクション)を受け入れます。フォームは、この基本形式で完全に機能します。

fields_forセクションにあるすべてのコードを取得し、部分的に配置しました。次に、フォームの下部に「新しいラウンドを追加」リンクを作成し、リンクが押されるたびにリンクの上に部分的に表示することを計画しました。これにより、新しいラウンドのフォームに新しいセクションが追加され、ユーザーは必要な数のラウンドを入力できるようになります。これは私が仕事をするのに苦労している部分です。

このコードをcomps_helperに追加しました:

def addNewRound
   render "add_round"
end

これにより、ファイル/views/comps/_add_round.html.erbがレンダリングされます。

私の質問は、リンクがクリックされたときにこれをフォームにレンダリングするにはどうすればよいですか。私が行った調査で得られる限り、次のとおりです。

<%= link_to "Add new round", { }, :remote => true %>

addNewRoundメソッドを実行する{}に何が入るのか正確にはわかりません。そして、comps_controllerファイルに何を追加する必要があるのか​​わかりません。

助けてくれてありがとう。

4

1 に答える 1

2

コントローラでアクションを作成する必要があります

app / controllers / some_controller.rb

def hello
  respond_to do |format|
    format.js
  end
end

このアクションへのルートを定義します。

ルート.rb

get "/hello" => "some#hello", :as => :hello

次に、次のようなこのアクションへのリンクを作成します。

<%= link_to "render it!", hello_path, remote: true %>
<div id="some_id"></div>

このリンクをクリックすると、アクションへの道が見つかり、js(javascript)で応答します。これは、アクションにjsのみで応答するように指示したためです。

最後に、ビュー内の任意の場所にパーシャルをレンダリングします(*この例ではsome_id div *)

app / views / some / hello.js.erb

$("#some_id").html("<%=j addNewRound %>");

警告:動的フォームの作成は面倒です。多くの問題に直面します(新しいフォーム要素に異なるIDを設定するなど)。ライアンベイツnested_formgemを使用することを強くお勧めします

于 2012-09-10T21:03:40.807 に答える