我有点不确定如何问这个,所以我为笨重的解释道歉。
我有三个模型,User,Waterusage和Goals
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形式并从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
这是GoalsController
class GoalsController&lt; ApplicationController的 before_action:authenticate_user!
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>
这似乎是我使用
从waterusage模型中检索信息的方式self.household_size = @waterusage.household_size
我可以使用加入吗?
waterusage模型适用于BTW。
由于
答案 0 :(得分:0)
不知道这是否是最好的方式,但我会使用这样的东西:
您可以使用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
时,它会检查该用户的水分并初步确定目标值。因此,您不必更改控制器上的任何内容,即使您在控制台上执行此操作,也可以。猜测使用模型回调来做这件事是一种更好的做法。不知道它是否解决了你的问题,但试一试。祝你好运!
答案 1 :(得分:0)
您的错误消息是:
Section
!ifdef MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY & MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME
${If} $MultiUser.InstallMode == CurrentUser
WriteRegStr HKCU "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME}" "$InstDir"
${Else}
WriteRegStr HKLM "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME}" "$InstDir"
${EndIf}
!else
WriteRegStr HK?? Software\?? ?? "$InstDir" ; Must match key used in InstallDirRegKey
!endif
SectionEnd
CURRENT_USER&#39;为#
目标:0x007fbedde9a590`
NameError in GoalsController#create
undefined local variable or method
对象由您正在使用的Devise gem在控制器内自动定义。在您的模型中定义不。
您的一条评论中包含您在目标模型中使用的以下代码段:current_user
。这就是您的错误消息所指的内容。 (请注意,您的一条评论中的这段代码与您原始帖子中的代码不一致。这使得更难以确定此处出现的问题。)