도서 클럽 앱을 만들고 있습니다. 사용자는 다른 사람들과 함께 읽고 싶은 책을 업로드 할 수 있습니다. Google 도서 API에서 도서 정보를 가져오고 현재 컨트롤러에서 API 호출을 받았습니다. 나는 이것이 추악하고 unrailsy이지만 모델에서 작동하게하는 데 문제가 있다는 것을 압니다. 이 클리너를 만드는 가장 좋은 리팩터로 무엇을 제안 하시겠습니까?컨트롤러에서 레일로 모델로 API 호출 이동
new.html.erb의 -from 책
<%= form_for :book, url: books_path do |f| %>
<fieldset>
<h1 class="text-center">Add A Book</h1>
<div class="form-group">
<label class="col-md-4 control-label" for="name">Title</label>
<div class="col-md-8">
<%= f.text_field :title, required: true, class: "form-control" %><br>
</div>
</div>
<div class="form-group">
<label class="col-md-4 control-label" for="genre">Genre</label>
<div class="col-md-8">
<%= f.select :genre, [["Sci-fi", "Sci-fi"], ["Fantasy", "Fantasy"], ["Comic", "Comic"], ["Manga", "Manga"]], class: "form-control" %>
</div>
</div>
<div class="form-group">
<div class="col-md-12">
<%= f.submit "Create Book", class: "btn btn-success" %>
</div>
</div>
</fieldset>
<% end %>
books_controller.rb
def create
@user = current_user
find_book
redirect_to root_path
end
require "openssl"
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
def find_book
tempBook = params[:book][:title]
tempGenre = params[:book][:genre]
url = "https://www.googleapis.com/books/v1/volumes?q=" + tempBook + "&key=secret_key"
uri = URI(url)
response = Net::HTTP.get(uri)
book_data = JSON.parse(response)
b = Book.new
b.user_id = @user.id
b.title = book_data["items"][0]["volumeInfo"]["title"]
b.genre = tempGenre
b.author = book_data["items"][0]["volumeInfo"]["authors"][0]
b.publisher = book_data["items"][0]["volumeInfo"]["publisher"]
b.publication_date = book_data["items"][0]["volumeInfo"]["publishedDate"]
b.synopsis = book_data["items"][0]["volumeInfo"]["description"]
b.image = book_data["items"][0]["volumeInfo"]["imageLinks"]["thumbnail"]
@book = b.save
end
book.rb
class Book < ActiveRecord::Base
belongs_to :user
has_many :reviews
def set_user(user)
self.user_id = user.id
self.save
end
end
그것은이 방식으로 작동하지만, 못생긴 내가해야 내 열쇠를 숨기고 대신 열어 둡니다.
모델에 함수를 추가하고 제목과 장르를 show 메서드에서 변수로 선언했지만 모델에 전달되지 않아 작동하지 않았습니다.
감사합니다.
다음 코드는 시도했지만 작동하지 않았습니다. @tempBook은 nil이므로 모델을 엉망으로 만든다. 변수를 가져 오기 전에 모델이 실행되고 있다고 가정하고 있습니까?
는 book.rb
는class Book < ActiveRecord::Base
belongs_to :user
has_many :reviews
def set_user(user)
self.user_id = user.id
self.save
end
require "net/http"
require "json"
require "openssl"
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
def self.find_book
url = "https://www.googleapis.com/books/v1/volumes?q=" + @tempBook + "&key=SECRET_KEY"
uri = URI(url)
response = Net::HTTP.get(uri)
book_data = JSON.parse(response)
b = Book.new
b.user_id = @user.id
b.title = book_data["items"][0]["volumeInfo"]["title"]
b.genre = @tempGenre
b.author = book_data["items"][0]["volumeInfo"]["authors"][0]
b.publisher = book_data["items"][0]["volumeInfo"]["publisher"]
b.publication_date = book_data["items"][0]["volumeInfo"]["publishedDate"]
b.synopsis = book_data["items"][0]["volumeInfo"]["description"]
b.image = book_data["items"][0]["volumeInfo"]["imageLinks"]["thumbnail"]
@book = b.save
end
end
는 books_controller.rb 코드를 단순화하고 더 쉽게 읽을 수 있도록하기 위해
def create
@tempBook = params[:book][:title]
@tempGenre = params[:book][:genre]
@user = current_user
Book.find_book
redirect_to root_path
end
"작동하지 않음"에 대한 자세한 정보를 제공해 주실 수 있습니까? 시도한 코드를 보여줄 수 있습니까? 또한 관찰 한 내용을 알려주십시오 (정확히 오류 메시지는 무엇입니까?)? 우리는 실제 코드를 보게되면 더 잘 작동하도록 도와 줄 수 있습니다. (참고 : 서식을 편집 할 때 무서워하고 따라하기가 어렵습니다. 질문을 편집하여 거기에 넣으십시오.) –
아, 예 ... 그래서'@ tempbook'이 작동하지 않는 이유는 그들이 무엇인지 알지 못한다면'@ variable's를 사용해서는 안된다는 것입니다;) 컨트롤러를 통해 뷰에 변수를 전달할 때 유용합니다. 실제 메소드 인수 만 사용해야합니다. 나는 이것을 내 대답에 추가 할 것이다. –
나는 범위 밖에서 변수를 이동하기 위해 인스턴스 변수를 사용했지만 전역 변수가 아닌 해당 클래스에서 여전히 범위가 있다고 생각 했습니까? 하지만 그래, 범위의 개념은 여전히 내가 망쳐 놓은 것입니다 – nwimmer123