Функция создания в ruby ​​возвращает объект ActiveRecord :: Relation, а не фактическую запись - PullRequest
0 голосов
/ 30 сентября 2019

Я создаю два объекта и затем передаю их в представление с помощью функции redirect_to.
Объект Order в порядке и пригоден для использования в представлении, но объект Message имеет тип ActiveRecord :: Relation и любой вызов сообщения.variable получить noMethodError. Вот код

Код контроллера:

      @order = Order.create(order_params.merge(
        child: child, 
        address: prevOrderInfo.address,
        zipcode: prevOrderInfo.zipcode,
        user_facing_id: SecureRandom.uuid[0..7]))

      @message = Message.create(message_params.merge(:order_id => @order.id))

      redirect_to order_path(@order, @message)

Просмотр результатов проверки

#order object
--- '#<Order id: 8, user_facing_id: "d1791380", product_id: 1, child_id: 2, shipping_name:
  "Marge Simpson", address: "742 Evergreen Terrace", zipcode: "58008", paid: true,
  created_at: "2019-09-30 19:29:01", updated_at: "2019-09-30 19:29:01">'
#message object
--- '#<ActiveRecord::Relation [#<Message id: 6, full_name: "Homer ", email: "homer@gmial.com",
  message: "This is a message", order_id: 8, created_at: "2019-09-30 19:29:01", updated_at:
  "2019-09-30 19:29:01">]>'

html.erb прекрасно использует @order. <%= @order.child.full_name %> помещает "Мэгги Симпсон" на веб-страницу.

Но любое использование @message, например <%= @message.full_name %>, вызывает noMethodError для full_name

Не уверен, что я делаю, но зачем создаватьВызовите для таблицы заказа возврат одного типа, а другой для таблицы сообщений?

1 Ответ

0 голосов
/ 30 сентября 2019

@message кажется коллекцией какого-то рода. Вы должны быть в состоянии вызвать <%= @message.first.full_name %> или вы можете выполнить итерацию по нему и сделать следующее:

<% @message.each do |msg| %>
  <%= msg.full_name %>
<% end %>

ИЛИ вы можете изменить свой код, чтобы выполнить перенаправление следующим образом: redirect_to order_path(@order, message_id: @message.id)

в действии порядка показа у вас будет:

@order = Order.find(params[:id])

@message = Message.find(params[:message_id])

При таком подходе у вас будет объект @orderи @message объект, доступный на ваш взгляд.

Надеюсь, это поможет.

...