如何从另一个模型中显示(多个)参数

时间:2018-05-03 12:14:03

标签: ruby-on-rails ruby methods helper

我有一个带有管理员用户索引页面的网上商店来检查用户信息。在这个页面上,我现在想要显示送货地址(带名字,姓氏,街道......)。

我设法创建了这个帮助方法来获取firstname,使用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种不同辅助方法更好的方法......

我还尝试过&lt;%= customer(@ user.id).firstname%&gt;,但这会为nil:NilClass 提供错误 undefined method`lirstname'。< / p>

我的管理员:: CustomersController:

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

schema.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 :(得分:1)

您说您的代码适用于显示一个客户字段,但我对此表示怀疑。

这里的代码非常令人困惑:

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

几点:

  1. 方法名称表明它返回Customer或类似模型的实例。但它返回一个字符串OR nil(在个案中)。

  2. 方法接受名称​​ user 下的参数,假设该参数是User类的实例。但实际上它是一个ID。

  3. 您正在查询id字段。我认为它应该在user_id上。

  4. 我不会从方法中返回特定字段,而是返回ShippingAddress的实例。因此,我不必调用多种方法来显示多个字段。

  5. 因此,更新的代码将是这样的:

    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 %>