2013-05-27 52 views
2

我構建了一個Rails應用程序,該應用程序允許用戶根據Google圖書api的搜索結果創建一個Book對象。我有一個控制器,使用GoogleBooks gem處理搜索api,並將結果顯示在列表中。我正在努力想出一種方法,將書籍信息從單個搜索結果傳遞到Books控制器中的Create操作。從一個搜索結果塊創建對象Ruby on Rails

我的搜索控制器從我的搜索表單中獲取params並創建一個變量@results,我在'搜索'視圖中調用該變量。這裏是我的搜索控制器:

class SearchController < ApplicationController 

    def search 
     @results = GoogleBooks.search(params[:search]) 
    end 

end 

我的看法是這樣的:

<h1>Search Results</h1> 

<% @results.each do |result| %> 
    <ul> 
     <li><%= result %></li> 
     <li><%= result.title %></li> 
     <li><%= result.authors %></li> 
     <li><%= result.isbn %></li> 
     <li><%= result.description %></li> 
    </ul> 
<% end %> 

說我有問題是,我不知道如何傳遞給我的書單個結果數據控制器的「創建」操作在數據庫中生成一本新書。我不認爲我可以將'result.title'或'result.author'傳遞給Book控制器,因爲它們不是實例變量,也無法區分每個結果。

我的搜索結果頁面源代碼看起來像這樣,如果有任何幫助的話。

<h1>Search Results</h1> 

    <ul> 
     <li>#&lt;GoogleBooks::Item:0x007ff75d2bd138&gt;</li> 
     <li>Kansha: Celebrating Japan&#39;s Vegan and Vegetarian Traditions</li> 
     <li>Elizabeth Andoh</li> 
     <li>9781607743965</li> 
     <li>The celebration of Japan’s... </li> 
    </ul> 
    <ul> 
     <li>#&lt;GoogleBooks::Item:0x007ff75d2bc148&gt;</li> 
     <li>Advanced Energy Saving and Its Applications in Industry</li> 
     <li>Kazuo. Matsuda, Yasuki. Kansha, Chihiro. Fushimi</li> 
     <li>9781447142072</li> 
     <li>The conventional approach for... </li> 
    </ul> 

我想使用一個按鈕來允許用戶選擇這本書,然後將本書的信息傳遞給創建操作。我在想我需要用button_to做這樣的事情:

<%= button_to 'Create Book', book_path, :method => :post %> 

但是,如何獲取單個圖書的數據到創建操作?

+1

這裏有很多事情要做 - 完整的解決方案需要花費太多時間進行勾畫。但簡單的答案是,我肯定會用ajax請求來做到這一點。將每個項目與一個按鈕一起包裝在一個div中,然後將ajax後置操作綁定到按鈕點擊。您將可以輕鬆獲取相同父元素內的數據,以作爲參數傳遞。 – gregates

+0

@gregates感謝您的提示。我對rails比較陌生,但我會考慮實現一個AJAX post操作。 –

回答

1

根據您的總體佈局,我建議先爲每個書籍結果構建一個內嵌表格。你可以用隱藏的字段來做到這一點。正如gregates所說,很難提供完整的答案,但這可能會讓你朝着正確的方向前進。

在你SearchController:

def search 
    @results = GoogleBooks.search(params[:search]) 
    @books = [] 
    @results.each do |result| 
    @books << Book.new 
    end 
end 

在你看來:

<% @results.each_with_index do |result, index| %> 

    <%= form_for(@books[index]) do |f| %> 

    <ul> 
     <li><%= result.title %></li> 
     <li><%= result.authors %></li> 
     <li><%= result.isbn %></li> 
     <li><%= result.description %></li> 
    </ul> 

    <%= f.hidden_field :title, value: result.title %> 
    <%= f.hidden_field :authors, value: result.authors %> 
    <%= f.hidden_field :isbn, value: result.isbm %> 
    <%= f.hidden_field :description, value: result.description %> 

    <%= button_to 'Create Book', controller: 'books', action: 'create' %> 

    <% end %> 

<% end %> 

此外,根據您的整體設計,有可能是一個更好的方法,但希望這將提供一些啓示。

祝你好運!

+0

這對我來說很好。可能稍後嘗試重構一下,但現在這是一個很好的解決方案。謝謝。 –