2

我正在构建一个 Rails 应用程序,它允许用户根据来自 Google Books api 的搜索结果创建一个 Book 对象。我有一个控制器来处理搜索 api,使用 GoogleBooks gem 并在列表中显示结果。我正在努力寻找一种将书籍信息从单个搜索结果传递到 Books 控制器中的 Create 操作的方法。

我的搜索控制器从我的搜索表单中获取参数并创建一个变量@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 %>

但是如何将单本书的数据获取到创建操作?

4

1 回答 1

1

根据您的整体布局,我建议首先为每个 Book 结果构建一个内联表单。您可以使用隐藏字段执行此操作。正如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 %>

同样,根据您的整体设计,可能会有更优雅的方法,但希望这会提供一些灵感。

祝你好运!

于 2013-05-27T16:59:46.927 回答