2017-09-15 4 views
0

私はAmazonからvacuum gem(v。2.0.2)を使用して情報を要求しようとしています。しかし、私はどのように私が得た結果を返すことになっているのか分かりません。現在、私は自分のメソッドにこのコードを作っています:Rubyモデルで変数を返さないメソッド

def self.isbn_lookup(val) 
    request = Vacuum.new('US') 
    request.configure(
    aws_access_key_id: 'access_key_goes_here', 
    aws_secret_access_key: 'secret_key_goes_here', 
    associate_tag: 'associate_tag_goes_here' 
) 
    response = request.item_lookup(
    query: { 
     'ItemId' => val, 
     'SearchIndex' => 'Books', 
     'IdType' => 'ISBN' 
    }, 
    persistent: true 
) 
    fr = response.to_h #returns complete hash 
    if fr["ItemLookupResponse"]["Items"]["Item"]["ItemAttributes"]["Author"] 
    @author = fr.dig("ItemLookupResponse","Items","Item","ItemAttributes","Author") 
    end 
    if fr["ItemLookupResponse"]["Items"]["Item"]["ItemAttributes"]["Author"] 
    @title = fr.dig("ItemLookupResponse","Items","Item","ItemAttributes","Title") 
    end 
    if fr["ItemLookupResponse"]["Items"]["Item"]["ItemAttributes"]["Manufacturer"] 
    @manufacturer = fr.dig("ItemLookupResponse","Items","Item","ItemAttributes","Manufacturer") 
    end 
    if fr["ItemLookupResponse"]["Items"]["Item"]["ItemAttributes"][6]["URL"] 
    @url = fr.dig("ItemLookupResponse","Items","Item","ItemLinks","ItemLink",6,"URL") 
    end 
end 

このメソッドで作成した変数をコントローラで使用できるようにしたいと思います。コントローラの著者、タイトル、製造元、およびURLのインスタンス変数にどのようにアクセスできますか?ユーザーがISBNを入力すると、サーバーにAJAXリクエストを送信して関連情報(作成者、タイトルなど)を要求するようにしたいと考えています。

def create 
    @listing = Listing.new(listing_params) 
    @listing.user = current_user 
    if @listing.save 
    flash[:success] = "Your listing was successfully saved." 
    redirect_to listing_path(@listing) 
    else 
    render 'new' 
    end 
end  
def edit 
    @isbn = Listing.isbn_lookup(1285741552) 
end 
+2

インスタンス変数は決して設定されません。 'return fr'という行がありますか?その行の後のすべてが決して実行されません。 –

+0

私はコードを更新しました。 –

+0

しかし、どのように私はそれが私が存在するすべての変数を返すようにするのですか?そして、それを私のコントローラーにどう実装するのですか? –

答えて

2

クイックフィックスは、メソッドはポロ(昔ながらのRubyオブジェクト)などの値を返すようにして、コントローラからインスタンス変数に割り当てることであろう。現在、これは私のコントローラがどのように見えるかです。 isbn_lookup方法の終わりに、この置く:

return {title: title, author: author, manufacturer: manufacturer, url: url} 

isbn_lookup方法でインスタンス変数を使用しないでください - 彼らはあなたが彼らがやりたいように動作しません。これを理解するためにRubyクラスがどのように機能するかについてもう少し学ぶ必要があるかもしれません。要約すると、コントローラーメソッドはコントローラのインスタンスで実行されますが、isbn_lookupクラスメソッドと書かれていますが、インスタンス変数は実際には意味がありません。詳細については、Using Instance Variables in Class Methods - Rubyを参照してください。

このようにすべてのキーをリストするのが醜いと感じたら、オブジェクトを段階的に構築することができます。 isbn = {}置く方法の冒頭で、その後、isbn[:author] = fr.dig(...)のように、エンドreturn isbn

でコントローラメソッドでものを行う:

@isbn = Listing.isbn_lookup(1285741552) 
@title = @isbn[:title] 
@manufacturer= @isbn[:manufacturer] 
@author = @isbn[:author] 
@title = @isbn[:title] 

@title@manufacturerなどのインスタンス変数の設定は一種でありますあなたは単にビューから@isbn[:author]を使うことができるので不必要です。あなたのフォローアップの質問への応答で


ここでこの権利は奇妙です:

if fr["ItemLookupResponse"]["Items"]["Item"]["ItemAttributes"][6]["URL"] 
    @url = fr.dig("ItemLookupResponse","Items","Item","ItemLinks","ItemLink",6,"URL") 
end 

私はあなたが作品を掘る方法を理解していません。ネストしたオブジェクトを掘り起こす方法はです。です。引数にあるキーの項目が存在しない場合は、nilを返します。例えば{}.dig(:a, :b, 1, 2, :etc) == nil。あなたは基本的に「?あなたは==意味した」ルビーからの警告を言っれるかもしれませんが、

if url = fr.dig("ItemLookupResponse","Items","Item","ItemLinks","ItemLink",6,"URL") 
    # etc 

url = fr.dig("ItemLookupResponse","Items","Item","ItemLinks","ItemLink",6,"URL") 
if url 
    # etc 

あるいはインラインの割り当てを使用すること:だからあなたはこれを行うことができます(あなたはしなかった)。

ここには条件が本当に必要ではありません。たとえば、URLがnilであっても、メソッドは:urlキー(これはまれにゼロ値を持つ)を持つハッシュを返すことができます。あなたがどこにいても実際にははURLが存在するかどうかを知る必要があります(例:表示目的では表示)if @isbn[:url]

+0

[OK]を、何らかの理由でこれを使用すると、エラーが発生します。 "[nil:NilClassの未定義メソッド' [] '。私はそれがurl変数の数値として要素を参照している方法かもしれないと思います。このエラーを回避する簡単な方法はありますか? –

+1

@JackMoodyは答えに対する更新を見ます。 –

関連する問題