Как показать (несколько) параметров из другой модели - PullRequest
0 голосов
/ 03 мая 2018

У меня есть интернет-магазин с индексной страницей администратора для проверки информации о пользователе. На этой странице я хочу показать адрес доставки (с именем, фамилией, улицей ...).

Мне удалось создать этот вспомогательный метод, чтобы получить имя, используя user_id, который имеет и user, и shipping_address:

module Admin::CustomersHelper
 def customer(user)
  s = ShippingAddress.find_by(id: user)
  if s
   s.firstname
  end
 end
end

На мой взгляд, у меня есть:

<%= customer(@user.id) %>

Это работает, но проблема в том, что мне нужно показать более 10 различных параметров, и должен быть лучший способ, чем создание 10 различных вспомогательных методов ...

Я также пытался сделать <% = customer (@ user.id) .firstname%>, но это выдает ошибку неопределенный метод `firstname 'для nil: NilClass .


Мой Admin :: CustomersController:

def index
 @users = User.all
 @shipping_addresses = ShippingAddress.all
end

Некоторые важные части моей схемы. Rb:

create_table "shipping_addresses", force: :cascade do |t|
 t.string "firstname"
 t.string "lastname"
 t.string "street"
 ...etc
 t.bigint "user_id"
 t.index ["user_id"], name: "index_shipping_addresses_on_user_id"
 ..etc
 add_foreign_key "invoice_addresses", "users"
 add_foreign_key "order_items", "orders"
 add_foreign_key "order_items", "products"
 add_foreign_key "orders", "order_statuses"
 add_foreign_key "orders", "users"
 add_foreign_key "shipping_addresses", "users"
end

1 Ответ

0 голосов
/ 03 мая 2018

Вы говорите, что ваш код работает для отображения одного поля клиента, но я сомневаюсь в этом.

Ваш код здесь очень запутанный:

module Admin::CustomersHelper
  def customer(user)
    s = ShippingAddress.find_by(id: user)
    if s
      s.firstname
    end
  end
end

Несколько баллов:

  1. Имя метода предполагает, что он возвращает экземпляр Customer или подобную модель. Но он возвращает строку ИЛИ ноль (в случаях).

  2. Метод принимает аргумент под именем user , который можно считать экземпляром класса User. Но на самом деле это идентификатор.

  3. Вы запрашиваете в поле id. Я думаю, что это должно быть на user_id.

  4. Я бы не возвращал конкретное поле из метода, но экземпляр ShippingAddress. Так что мне не нужно вызывать несколько методов для отображения нескольких полей.

Итак, обновленный код будет выглядеть так:

module Admin::CustomersHelper
  def shipping_address_for(user_id)
    ShippingAddress.find_by(user_id: user_id)
  end
end

А в представлениях

<% shipping_address = shipping_address_for(@user) %>
<% if shipping_address %>
  <%= shipping_address.firstname %>
  <%= shipping_address.lastname %>
  ...
<% end %>
...