1

ユーザーが本のタイトルを入力するために使用するフォームがあり、それを外部の本の検索 API に渡します。次に、ページをリロードせずに本の結果をすぐ下に表示したいと考えています。

new.html.haml

(タイトル入力フォーム)

= form_tag book_search_path, :method => :get, :remote => true do
    = label_tag "Title: (#{@title})"
    = text_field_tag "title", ""
    = submit_tag "Search!"

#results // results should be updated here

books_controller.rb

(book_search_path はここに、「検索」アクションに移動します)

class BooksController < ApplicationController

def index
    @books = Book.find :all
    render :action => 'list'
end 

def new 
    @books = Book.find :all
end 

def search
    Rails.logger.info("DOSEARCH!!!")
    # HIT THE API
    @results = search_keywords params[:title]
    # implicit render search.js.erb
end

search.js.erb

(books#search アクションの最後にレンダリングされます)

m = $('#results');    
m.innerHTML = "<%= escape_javascript(render :partial => 'results.html.haml') %>";

_results.html.haml

(これは、ajax を介して結果 div に挿入したいものです)

- @results.each do |b| 
  %tr 
    %td 
      - Rails.logger.info("Got title...#{b.title}")
      = b.title
    %td 
      = b.isbn

_results.html.haml「Got title」ログが表示されるので、それが実行されていることはわかっていますが、 resultsdiv 内の new.html.haml には表示されません。何が起こっているのか分かりますか?

編集: books_controller を更新しました。完全なコードで。Book.rb は :attr_accessible フィールドを除いて空のモデルです

編集: Ajax 応答:

m = $('#results');    
m.innerHTML = "<table id=\'results_table\'>\n  <tbody><\/tbody>\n  <th>Title<\/th>\n  <th>ISBN<\/th>\n  <tr>\n    <td>\n      The Odyssey\n    <\/td>\n    <td>\n      \n    <\/td>\n  <\/tr>\n  <tr>\n    <td>\n      The Odyssey of Homer\n    <\/td>\n    <td>\n      1604240687\n    <\/td>\n  <\/tr>\n  <tr>\n    <td>\n      The Odyssey\n    <\/td>\n    <td>\n      1613821166\n    <\/td>\n  <\/tr>\n  <tr>\n    <td>\n      The Odyssey of Homer\n    <\/td>\n    <td>\n      1437818080\n    <\/td>\n  <\/tr>\n  <tr>\n    <td>\n      Odyssey\n    <\/td>\n    <td>\n      0872204847\n    <\/td>\n  <\/tr>\n  <tr>\n    <td>\n      The Odyssey (Penguin Classics)\n    <\/td>\n    <td>\n      0143039954\n    <\/td>\n  <\/tr>\n  <tr>\n    <td>\n      The Odyssey: The Fitzgerald Translation\n    <\/td>\n    <td>\n      0374525749\n    <\/td>\n  <\/tr>\n  <tr>\n    <td>\n      The Odyssey\n    <\/td>\n    <td>\n      1613823398\n    <\/td>\n  <\/tr>\n  <tr>\n    <td>\n      The Odyssey\n    <\/td>\n    <td>\n      0763642681\n    <\/td>\n  <\/tr>\n  <tr>\n    <td>\n      The Odyssey (Penguin Classics)\n    <\/td>\n    <td>\n      0140449116\n    <\/td>\n  <\/tr>\n<\/table>\n";

編集: これは Rails 3.2.8 です

4

1 に答える 1

2

searchアクションに次のブロックを追加してみてください。

respond_to do |format|
  format.js
end

search.js.erbまた、 の行を次のように置き換えます。

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

更新

本当の問題 (他の構文の問題がないと仮定) は、innerHTML がすべてのブラウザーでサポートされていないことです (これを参照してください) 。

于 2012-09-07T23:00:24.970 に答える