【问题标题】:Rails: Setting Model Attributes to Attributes from Another ModelRails:将模型属性设置为另一个模型的属性
【发布时间】:2018-05-11 16:48:39
【问题描述】:

我有点不确定如何问这个问题,所以我为笨拙的解释道歉。

我有三个模型,用户、用水量和目标

class Goal < ApplicationRecord
     belongs_to :user
end

class Waterusage < ApplicationRecord
     belongs_to :user
end

class User < ApplicationRecord
      # Include default devise modules. Others available are:
      # :confirmable, :lockable, :timeoutable and :omniauthable,
      has_one :waterusage, :dependent => :destroy
      has_one :goals, :dependent => :destroy
end

用水量首先由用户填写,然后是目标。目标是与 waterusage 完全相同的模式,但使用 waterusage 表单的一部分并从 waterusage 复制剩余的属性。

class Goal < ApplicationRecord
   belongs_to :user



# before_validation :get_from_waterusage
  before_validation :calculate_totals

  def get_from_waterusage
    self.household_size = @waterusage.household_size
    self.swimming_pool = @waterusage.swimming_pool
    self.bathroom_sink_flow_rate = @waterusage.bathroom_sink_flow_rate
    self.low_flow_toilet = @waterusage.low_flow_toilet
    self.kitchen_sink_usage = @waterusage.kitchen_sink_usage
    self.kitchen_sink_flow_rate = @waterusage.kitchen_sink_flow_rate
    self.dishwasher_rate = @waterusage.dishwasher_rate
    self.dishwasher_multiplier = @waterusage.dishwasher_multiplier
    self.laundry_rate = @waterusage.laundry_rate
    self.laundry_multiplier = @waterusage.laundry_multiplier
    self.lawn_size = @waterusage.lawn_size
    self.carwash_rate = @waterusage.carwash_rate
    self.carwash_multiplier = @waterusage.carwash_multiplier
    self.miles = @waterusage.miles
    self.statewater = @waterusage.statewater
    self.percent_statewater = @waterusage.percent_statewater
    self.pet_cost = @waterusage.pet_cost
     end
    ...
    end

这是目标控制器

类目标控制器

  def new
    @goal = goal.new
  end

  def create
    #@user = User.find(params[:user_id])
    @goal = current_user.create_goal(goal_params)
    redirect_to goal_result_path

  end

  def destroy
    @user = User.find(params[:user_id])
    @goal = @user.goal.find(params[:id])
    @goal.destroy
    redirect_to user_path(current_user)
  end

  def show
    @goal = goal.find(params[:id])
  end

  def results

    if current_user.goal.get_individual_total > 6000
      @temp = 6000
    else
      @temp = current_user.goal.get_individual_total
    end

    @goal = current_user.goal

  end

  private
    def goal_params
      params.require(:goal).permit(:household_size, :average_shower,
        :shower_flow_rate, :bath_rate, :bath_multiplier, 
        :bathroom_sink_usage,
        :bathroom_sink_flow_rate, :mellow, :low_flow_toilet, 
        :kitchen_sink_usage,
        :kitchen_sink_flow_rate, :dishwasher_rate, 
        :dishwasher_multiplier,
        :dishwasher_method, :laundry_rate, :laundry_multiplier, 
    :laundry_method,
        :greywater, :lawn_rate, :lawn_multiplier, :lawn_size, 
 :xeriscaping,
        :swimming_pool, :swimming_months, :carwash_rate, 
  :carwash_multiplier,
         :carwash_method, :miles, :statewater, :percent_statewater, 
 :shopping,
        :paper_recycling, :plastic_recycling, :can_recycling, 
  :textile_recycling,
        :diet, :pet_cost, :individual_total, :household_total,       
   :home_usage, :outdoor_usage,
        :individualDifference, :householdDifference, :vehicle_usage, 
 :power_usage, :indirect_source_usage,
        :individualDifference, :householdDifference)
    end

end

我目前遇到以下错误:

NameError in GoalsController#create 
undefined local variable or method `current_user' for # 
<Goal:0x007fbedde9a590>

这似乎是我从用水模型中检索信息的方式

self.household_size = @waterusage.household_size

我可以使用连接吗?

用水模型顺便说一句。

谢谢

【问题讨论】:

  • 您似乎遗漏了错误...
  • GoalsController 中的 NameError#create undefined local variable or method `current_user' for #<0x007fbedde9a590>

标签: sql ruby-on-rails model-associations


【解决方案1】:

不知道这是否是最好的方法,但我会使用这样的方法:

  • 在您的目标模型中,您可以检查其用户是否已经有用水量。如果有,请填写该用水量的值

您可以使用after_initialize 回调来实现。在您的目标模型中,类似于

class Goal < ApplicationRecord
  belongs_to :user
  after_initialize :set_default_values

  def set_default_values

    waterusage = self.user.try(:waterusage)
    if waterusage

        self.attribute1 = waterusage.attribute1
        self.attribute2 = waterusage.attribute2
        self.attribute3 = waterusage.attribute3
        #and it goes on...

    end

  end

end

因此,当您执行Goal.new 时,它会检查该用户的用水量并根据您的目标初始化这些值。因此,您无需更改控制器上的任何内容,即使您在控制台上进行更改,它也可以正常工作。猜猜这是一个更好的做法,使用模型回调来做到这一点。不知道它是否能解决您的问题,但请尝试一下。祝你好运!

【讨论】:

    【解决方案2】:

    您的错误信息是: NameError in GoalsController#create undefined local variable or methodcurrent_user' 用于# 目标:0x007fbedde9a590`

    current_user 对象由您使用的 Devise gem 在您的控制器内部自动定义。它不会在您的模型中定义。

    您的一个 cmets 包含您说您在目标模型中使用的以下 sn-p:current_user.waterusage.household_size。这就是您的错误消息所指的内容。 (请注意,来自您的一个 cmets 的这个 sn-p 与您原始帖子中的代码不一致。这使得更难确定这里出了什么问题。)

    【讨论】:

      猜你喜欢
      • 2021-07-06
      • 2014-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多