0

「エントリ」と呼ばれる ActiveRecord::Base モデルがあります。それにファイルが添付されています。Paperclip を使用してファイルをアップロードしています。ビューを使用し、ビューでサーバー側のコードを使用すると、すべてが楽しくなります。しかし今は、JSON と AJAX を使用して、フロント エンドを純粋な HTML5 でレンダリングしたいと考えています。そのためには、ファイルの URL が必要です。しかし、ペーパークリップはファイル名、ファイルのコンテンツタイプなどを保存するだけで、ファイルのURLを取得できます。

url = @post.myFile.url

したがって、URLをDBに個別に保存したくありませんが、「Post」モデルの属性にしたいので、設定して取得し、送信されるJSONの一部にする必要がありますクライアント側に。

私のコントローラーには、「index」メソッドがあります。

def index
@posts = Post.order("created_at desc")

  respond_to do |format|
    format.html # index.html.erb
    format.json { render json: @posts }
  end
end

モデルを変更するにはどうすればよいですか? コントローラーを変更するにはどうすればよいですか? 使ってみた

attr_accessor :file_url

私のモデルで、コントローラーのインデックスメソッドに行を追加しました

@posts.each do |myPost|
   myPost.file_url = myPost.myFile.url
end

しかし、成功できませんでした。どんな助けでも大歓迎です。ありがとうございました。

4

3 に答える 3

0

RABL gemを使用して、Json 出力のフォーマットを制御することを検討できます。

事実上、Json 形式のビュー ファイルが追加され、URL をノードとしてデータに追加できます。

于 2013-04-11T07:15:00.573 に答える
0

あなたの目標を完全に理解しているかどうかはわかりません。JSON をレンダリングする前に、各投稿から file_url を利用できるようにしますか? その場合、モデルに api_attributes を追加できます。つまり、次のようになります。

def api_attributes
  {
    id: self.id.to_s,
    title: self.title.to_s,
    ...
    file_url: self.myFile.url,
    ...
  }
end

次に、次のような方法で json をレンダリングできます。

format.json { render json: @posts.collect{|post| post.api_attributes} }

これにより、指定したすべての api_attributes を持つすべての投稿が得られます。これがあなたが探しているものであることを願っています。

于 2013-04-10T22:55:04.327 に答える
0

ここには 2 つの問題があります。一方では、属性アクセサーを宣言する正しい軌道に乗っていました。コントローラーのループの代わりに、モデルで定義します。

def file_url
  myFile.url
end

2 つ目の問題は、コントローラーで配列をシリアル化するときに、仮想属性 file_url を含まない各要素のデフォルトのシリアル化を呼び出していることです。

これに対して私が推奨する解決策は、コントローラーが使用するシリアライゼーションを簡単にカスタマイズできるActiveModelSerializers gemです。仮想属性を追加するのは非常に簡単です。(配列シリアライザーが使用しないため、モデルで as_json メソッドをオーバーライドしても機能しないことに注意してください)

于 2013-04-10T23:09:13.193 に答える