2013-05-27 60 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

这对我来说很好。可能稍后尝试重构一下,但现在这是一个很好的解决方案。谢谢。 –