私は一生、RJSに要素のinnerHTMLをインスタンス変数の属性に置き換えることはできません。@thing.name
私はすべてのコードを示します(実際のプロジェクトから簡略化されていますが、それでも完全です)、そして解決策が誰かに明白な額平手打ちになることを願っています...
RoRでは、ランダムな漢字を表示する簡単なページを作成しました。
これは、Word
属性chinese
と。を持つオブジェクトですenglish
。
「これは何ですか?」というタイトルのリンクをクリックします。english
RJSを使用して属性を明らかにします。現在、「これは何ですか?」も非表示になっています。リンクして「別の方法を試してみませんか?」ページをリロードするだけのリンクで、新しいランダムな文字で効果的に最初からやり直します。
これは問題ありませんが、独自のデータベースクエリを作成する他の要素がページにあるため、ページの残りの部分はそのままにして、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
最も明白なオプションで-そしてパラメータで何が渡されるかを研究しましたが、役に立ちませんでした。この時点で、自分が何をしているのかわからないことに気づきます。
これが私の最初の質問です。簡潔にするのではなく、必要なすべてのコードを提供する側に誤りがありました。どんな助けでも大歓迎です。