Ruby on rails .try()无法正常工作

时间:2013-02-18 11:26:29

标签: ruby-on-rails ruby-on-rails-3

我正在尝试执行以下操作:

    <%= order.user.try(:first_name) %>
    <%= order.user.try(:last_name) %>
    <%= order.user.try(:email) %>

但是,当我查看此页面的索引时,数据不会出现在表格中。我还查看了日志,发现相关数据正在发布

  

在2013-02-18 11:15:02 +0000开始发布127.0.0.1的POST / / orders   OrdersController处理#create as HTML参数:   { “UTF8”=&GT;, “?”   “authenticity_token”=&gt; “中Rjf7 + Z8UAPh9ZofIrOs + p6AoGPfgd / 6rfdTRqJLtx0g =”,   “user”=&gt; {“first_name”=&gt;“测试”,“last_name”=&gt;“TestHome”,   “email”=&gt;“test@test.com”},“order”=&gt; {“address”=&gt;“3433234243”,   “card_number”=&gt;“45423554213994”,“card_type”=&gt;“签证”,   “card_expires_on(1i)”=&gt;“2013”​​,“card_expires_on(2i)”=&gt;“2”,   “card_expires_on(3i)”=&gt;“1”},“提交”=&gt;“确认订单”}购物车加载   (0.0ms)SELECT carts。* FROM carts WHERE cartsid = 8 LIMIT 1

所以我选择尝试

    <%= order.user.first_name %>
    <%= order.user.last_name %>
    <%= order.user.email %>

这样做导致了

NoMethodError in Orders#index

Showing C:/Users/sites/e-smart/app/views/orders/index.html.erb where line #18 raised:

undefined method `first_name' for nil:NilClass

我了解此错误的结果是因为first_name为空。

获取数据的最佳方式是什么?

Order.rb

class Order < ActiveRecord::Base
  attr_accessible :address, :card_expires_on, :card_type, :ip_address, :card_number, :first_mame, :last_name, :email, :quantity
  belongs_to :cart 
  has_many :line_items, :dependent => :destroy   
  belongs_to :user

User.rb

class User < ActiveRecord::Base

  has_and_belongs_to_many :roles
  has_many :role_users
  has_many :orders

3 个答案:

答案 0 :(得分:3)

你在说:

  

我理解这个错误的结果是因为first_name为空。

这不正确。错误的原因是用户是零。这也符合行为或try()返回-blank - 。

确保您订购的用户已正确填充。这意味着您的订单表必须具有user_id,并且必须正确分配用户。

答案 1 :(得分:1)

你在这里比较两个不同的东西 - try在你的视图中正常工作,当你在nil上调用它时返回nil(undefined method 'first_name' for nil:NilClass是因为order.user是nil,不是因为first_name是零。

这与您的POST无关 - 您在此尝试解决的实际问题是什么?

答案 2 :(得分:1)

首先让我澄清一下这个错误的含义。

  NoMethodError in Orders#index

  Showing C:/Users/sites/e-smart/app/views/orders/index.html.erb where line #18 raised:

  undefined method `first_name' for nil:NilClass

上述错误并不意味着user的 first_name 为空,但用户对象本身为 nil 。这意味着,您的@ order.user nil ,而 @ order.user.first_name 为空。

因此,order.user.try(:first_name)应该被读作打印放置此订单的用户的first_name,如果有一个用户与订单相关联,否则什么都不做但不扔任何错误

表单中的参数正在正确发送到您的控制器,可能是您在控制器中遗漏了与订单和用户记录相关联的内容。查看正在保存对象的控制器操作,并确保正确关联订单和用户。

希望这有帮助