Как вернуть значения в JSON, которые содержат модели, которые будут связаны с использованием JBuilder - PullRequest
0 голосов
/ 25 марта 2019

Я хотел бы вернуть значения в json, которые содержат модели, которые будут связаны с использованием JBuilder.Но я не знаю, как это сделать.И я сталкиваюсь с ошибкой, что «неопределенный метод xx» Вот мои настройки рельсов.

Модель

app / models / item.rb

belongs_to :user

app / models / user.rb

include UserImageUploader[:image]
has_many :item

vim app / uploaders / user_image_uploader.rb

# MiniMagick
require 'image_processing/mini_magick'

class UserImageUploader < Shrine
  include ImageProcessing::MiniMagick
  # The determine_mime_type plugin allows you to determine and store the actual MIME type of the file analyzed from file content.
  plugin :determine_mime_type
  plugin :store_dimensions
  plugin :pretty_location
  plugin :processing
  plugin :recache
  #The versions plugin enables your uploader to deal with versions,
  #by allowing you to return a Hash of files when processing.
  plugin :versions

  process(:store) do |io, context|
    original = io.download

    thumbnail = ImageProcessing::MiniMagick
      .source(original)
      .resize_to_limit!(600, nil)

    original.close!

    { original: io, thumbnail: thumbnail }
  end

  #plugin :versions

  #plugin :delete_promoted
  #plugin :delete_raw
end

items_controller.rb

@items = Item.includes(:user).page(params[:page] ||= 1).per(8).order('created_at DESC')
render 'index', formats: 'json', handlers: 'jbuilder'

Item / index.json.jbuilder

json.array! @items do |t|
  json.id t.id  //get the value normally
  json.created_at t.created_at //get the value normally 
  Json.user_id t.user.id  //undefined method `id’ 
  json.user_original_img t.user.image_url(:original) //undefined method `image_url' 
end

Как и выше, я не смог получить значение модели

Кстати, я мог бы правильно проверить значение с помощью консоли rails.

Bundle exec rails c

Item.first.user.image_url(:original)

  Item Load (1.5ms)  SELECT  `items`.* FROM `items` ORDER BY `items`.`id` ASC LIMIT 1
  User Load (0.7ms)  SELECT  `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
=> "https://xx.s3.ap-northeast-1.amazonaws.com/store/user/1/image/original-xx”

Item.first.user.id
   (19.0ms)  SET NAMES utf8mb4,  @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'),  @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483
  Item Load (0.9ms)  SELECT  `items`.* FROM `items` ORDER BY `items`.`id` ASC LIMIT 1
  User Load (0.8ms)  SELECT  `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
=> 1

Позвольте мнезнаю, с какими пунктами я ошибаюсь.

Спасибо, что прочитали мой вопрос.

Ответы [ 2 ]

0 голосов
/ 25 марта 2019

приложение / модели / user.rb

include UserImageUploader[:image]
has_many :item

должно быть has_many :items, не слишком уверенно в этом, но это может быть причиной того, что вы находите пустые столбцы в вашей БД. has_many, belongs_to отношение должно по умолчанию к обязательному.

0 голосов
/ 25 марта 2019

Похоже, что некоторые элементы в списке @items не имеют ассоциированного пользователя или их поле user_id равно nil.Тогда item.user будет nil.Когда вы делаете nil.image_url, вы получаете NoMethodError: undefined method 'image_url' for nil:NilClass.

. Вы можете добавить ограничение внешнего ключа между Item и User в своей миграции, чтобы избежать таких проблем:

add_foreign_key :items, :users

ПРИМЕЧАНИЕ:
Добавление внешнего ключа по-прежнему допускает пустые значения.Вы также должны добавить следующее в свой файл миграции, чтобы избежать пустых значений в столбце user_id:

change_column_null :items, :user_id, false

Спасибо @ 3limin4t0r за указание на это.

...