0

私は一生、RJSに要素のinnerHTMLをインスタンス変数の属性に置き換えることはできません。@thing.name

私はすべてのコードを示します(実際のプロジェクトから簡略化されていますが、それでも完全です)、そして解決策が誰かに明白な額平手打ちになることを願っています...

RoRでは、ランダムな漢字を表示する簡単なページを作成しました。

これは、Word属性chineseと。を持つオブジェクトですenglish

「これは何ですか?」というタイトルのリンクをクリックします。englishRJSを使用して属性を明らかにします。現在、「これは何ですか?」も非表示になっています。リンクして「別の方法を試してみませんか?」ページをリロードするだけのリンクで、新しいランダムな文字で効果的に最初からやり直します。

これは問題ありませんが、独自のデータベースクエリを作成する他の要素がページにあるため、ページの残りの部分はそのままにして、AJAX呼び出しによって新しいランダムな文字をロードしたいと思います。

これは予想よりも難しいことが判明しました。link_remote_toとpage.replace_htmlを使用してhtmlを置き換えるのに問題はありませんが、インスタンス変数を含むものを表示することはできません。

私はWordリソースとPageリソースを持っています。そこにはホームページがあり、そこでこのすべての楽しみが起こります。PagesControllerでは、ランダムな単語を取得する方法をいくつか作成しました。どちらも問題なく動作します...

コードは次のとおりです。

class PagesController < ApplicationController
  def home

    all_words = Word.find(:all)
    @random_word = all_words.rand

    @random_words = Word.find(:all, :limit => 100, :order => 'rand()')
    @random_first = @random_words[1]

  end
end

余談ですが、SQL呼び出し:limit => 100は、これらのランダムな単語を循環する方法を考えた場合に備えて使用します。今のところ、それは役に立ちません。また、私が知る限り、「rand()」はMySQL固有です。

ホームページビュー(HAML)には、次のものがあります。

#character_box
 = render(:partial => "character", :object => @random_word) if @random_word

#whatisthis
  = link_to_remote "☝ what is this?", :url => { :controller => 'words', :action => 'reveal_character' }, :html => { :title => "Click for the translation." }

#tryanother.{:style => "display:none"}
  = link_to "try another?", root_path

この場合の#は、コメントではなくdiv(指定されたID)を表すことに注意してください。これはHAMLであるためです。

「キャラクター」の部分は次のようになります(本当の理由はありませんが、erbです)。

<div id="character">
  <%= "#{@random_word.chinese}" } %>
</div>

<div id="revealed" style="display:none">
  <ul>
    <li><span id="english"><%= "#{@random_word.english_name}" %></span></li>
  </ul>
</div>

reveal_character.rjsファイルは次のようになります。

page[:revealed].visual_effect :slide_down, :duration => '.2'
page[:english].visual_effect :highlight,
                             :startcolor => "#ffff00",
                             :endcolor => "#ffffff",
                             :duration => '2.5'

page.delay(0.8) do
  page[:whatisthis].visual_effect :fade, :duration => '.3'
  page[:tryanother].visual_effect :appear
end

それはすべて完全にうまく機能します。

しかし、に変換して、「文字」要素を新しいものに置き換えるRJSテンプレートをポイントしようとするとlink_to "try another?"、 innerHTMLを静的テキストに置き換えた場合にのみ機能します。link_to_remoteそこにインスタンス変数を渡そうとすると、機能しません。

たとえば、Pages#home...の下に2番目のランダムな単語を定義したとします。

そこに追加@random_second = @random_words[2]します。

次に、ホームページビューで、「別の方法を試してみませんか?」を置き換えます。リンク(以前はを指していましたroot_path)、これで:

= link_to_remote "try another?", :url => { :controller => 'words', :action => 'second_character' }, :html => { :title => "Click for a new character." }

app / views / words / second_character.rjsで新しいRJSテンプレートを作成します。次のような簡単なテストで、機能していることがわかります。

page.replace_html("character", "hi")

しかし、これに変更すると:

page.replace_html("character", "#{@random_second.english}")

nilオブジェクトをフィードしたというエラーが表示されます。

app / views / words /second_character.rjsの1行目のActionView:: TemplateError(nil:NilClassの未定義のメソッド `english_name'):1:page.replace_html(" character "、"#{@ random_second.english} ")

もちろん、実際に@ random_second、@ random_thirdなどを無限にインスタンス化することは、実際のアプリではばかげています(最終的には、ページをリロードせずに新しいランダムレコードを取得し続けるためのより良い方法を見つけます)が、ポイントはここでインスタンス変数を機能させる方法がわかりません。

これは、次のように、指定したオブジェクトを含むパーシャルをレンダリングするという私の理想的なソリューションにさえ近づいていません。

page.replace_html 'character', :partial => 'new_character', :object => @random_second

インスタンス変数を直接機能させることができないため、パーシャルを介してインスタンス変数を機能させることはできません。

私は次のようなさまざまなことを試しました:

:object => @random_second

また

:locals => { :random_second => @random_second }

私はこれらをあちこちに追加しようとしました-link_to_remote最も明白なオプションで-そしてパラメータで何が渡されるかを研究しましたが、役に立ちませんでした。この時点で、自分が何をしているのかわからないことに気づきます。

これが私の最初の質問です。簡潔にするのではなく、必要なすべてのコードを提供する側に誤りがありました。どんな助けでも大歓迎です。

4

2 に答える 2

0

あなたは物事を混同しているようです。

を使用しますlink_to_function。これはコントローラーに再度移動せず、最初のコントローラーが設定したインスタンス変数を使用できます(rjsまたはjavascriptを実行してページを操作します)。

を使用link_to_remoteしますが、対応するコントローラーアクションを定義する必要があります。この場合second_character、オブジェクトを設定する必要があります@random_second。そして、呼び出される(クリックされる)たびに、新しい値を設定できます。

これがお役に立てば幸いです。

于 2010-05-26T06:46:22.253 に答える
0

メソッドreplace_htmlは、2番目のパラメーターとしてハッシュを取ります。私はあなたが次のようなことを言う必要があると思います:

page.replace_html "character", :text => "#{@random_second.english}"
于 2010-05-25T21:45:28.853 に答える