将JSON响应保存为对象rails

时间:2013-01-04 09:16:52

标签: ruby-on-rails ruby-on-rails-3 json model

我希望在此澄清我的理解或实际理解......我有一个像这样的JSON响应

  {
 "resultCount":1,
  "results": [
 {"kind":"ebook", "artistId":545975179, "artistName":"Gareth Halfacree", "price":9.99, 
 "description":"<p><b>Make the most out of the world&rsquo;s first truly compact  computer<\/b><\/p><p>It's the size of a credit card, it can be charged like a smartphone,  it runs on open-source Linux, and it holds the promise of bringing programming and playing  to millions at low cost. And now you can learn how to use this amazing computer from its co-creator, Eben Upton, in <i>Raspberry Pi User Guide<\/i>. Cowritten with Gareth Halfacree, this guide gets you up and running on Raspberry Pi, whether you're an educator, hacker, hobbyist, or kid. Learn how to connect your Pi to other hardware, install software, write basic programs, and set it up to run robots, multimedia centers, and more.<\/p><ul><li>Gets you up and running on Raspberry Pi, a high-tech computer the size of a credit card <\/li><li>Helps educators teach students how to program <\/li><li>Covers connecting Raspberry Pi to other hardware, such as monitors and keyboards, how to install software, and how to configure Raspberry Pi <\/li><li>Shows you how to set up Raspberry Pi as a simple productivity computer, write basic programs in Python, connect to servos and sensors, and drive a robot or multimedia center <\/li><\/ul><p>Adults, kids, and devoted hardware hackers, now that you've got a Raspberry Pi, get the very most out of it with <i>Raspberry Pi User Guide<\/i>.<\/p>", "genreIds":["10017", "38", "9027"], "releaseDate":"2012-08-30T07:00:00Z", "currency":"USD", "genres":["Computers", "Books", "Computers & Internet"], "trackId":559783692, "trackName":"Raspberry Pi User Guide",  "artistIds":[545975179],  "artworkUrl60":"http://a2.mzstatic.com/us/r30/Publication/v4/ba/a8/2c/baa82ce0-2ac7-7026-04da-6f74bc97b403/9781118464496.60x60-50.jpg", "artistViewUrl":"https://itunes.apple.com/us/artist/gareth-halfacree/id545975179?mt=11&uo=4", "trackCensoredName":"Raspberry Pi User Guide", "formattedPrice":"$9.99", "artworkUrl100":"http://a4.mzstatic.com/us/r30/Publication/v4/ba/a8/2c/baa82ce0-2ac7-7026-04da-6f74bc97b403/9781118464496.100x100-75.jpg", "trackViewUrl":"https://itunes.apple.com/us/book/raspberry-pi-user-guide/id559783692?mt=11&uo=4", "averageUserRating":2.5, "userRatingCount":5}]

}

并且我想在点击link_to之后将某些值保存到我的图书模型中(我读过link_to比说button_to更安全)

所以我有一个处理解析器的模块,它包含在我的控制器中

    module Book::BookFinder

BOOK_URL = 'https://itunes.apple.com/lookup?isbn='

def book_search(search)
    response = HTTParty.get(BOOK_URL + "#{search}", :headers => { 'Content-Type' => 'application/json', 'Accept' => 'application/json' })
results = JSON.parse(response.body)["results"]
end
    end

在我的书籍控制器中

class BookController < ApplicationController
before_filter :authenticate_admin_user!
include Book::BookFinder

def searchbook

end

def results
 results = book_search(params[:search])
 @results = results

end

def savebook

Book.create(:author => response["results"]["artistName"])

end
end

(首先我看一下这个并认为使用rails restful practice会更好,所以使用new和create方法?)

我有一个link_to设置将数据发布到我的模型

<%= link_to 'Save Book', savebook_path,  :method => :post %>

和我的路线

scope :controller  => :book do
get 'searchbook'
get 'results'
post 'savebook'

end

所以目前我在点击link_to时收到错误信息,它表示参数数量错误(0表示1)。

因为我从外部获取数据它引发了我一点点,当处理使用新的,创建,编辑等表单发布数据时它是有道理的,但在这里我有点迷失

任何人都可以提供一些建议/解决方案来帮助我了解需要发生的事情

由于

1 个答案:

答案 0 :(得分:3)

我建议你稍微改变架构。假设您在结果操作中收到api响应:

def results
  ...
  @results = book_search(params[:search])
  @book = Book.new
  @book.author = results[0]["artistName"]
  ...
end

def create
  @book = Book.new(params[:book])
  if @book.save
    redirect_to @book, notice: 'Book was successfully saved'
  else
    render action:new
  end
end

结果视图,而不是

<%= link_to 'Save Book', savebook_path,  :method => :post %>

使用

...
<%= form_for @book do |f| %>
  <%= f.hidden_field :author %>
  ...
  <%= f.submit 'Save book' %>
<% end %>

绝对标准的Books控制器,带有创建动作