我需要将一个值传递给来自不同控制器的模型中的属性,它们之间没有直接关系。在下面的例子中,我需要从Planting控制器更新Field Model中的farming_year。
Field模型:
class Field < ApplicationRecord
has_many :crops
attr_accessor :farming_year
def getting_crops
@crops_list = Crop.select('crops.name').where(field_id: self.id, year: self.get_farming_year) # doesn't get the farming_year
end
def get_farming_year
@farming_year # passing the value directly will work @farming_year=2015!!
end
def farming_year=(val)
@farming_year = val # passing the value directly won't work @farming_year=2015!!
end
end
在种植控制器中:
def new
@field = Field.new
@field.farming_year = session[:working_year]
@field.save
flash.now[:success] = @field.get_farming_year # it works and gives the correct year
end
当我将get_farming_year方法中的@farming_year更改为@ farming_year = 2016时,代码将起作用并将提供正确的Crops记录。上面代码中的flash消息没有任何更改将从模型中提供正确的年份。我认为我的主要问题是将农业年从get_farming_year方法传递给getting_crops方法。
提示:框架年份属于裁剪而不属于字段,因此我无需将其添加到字段表中。
任何想法如何实现?
答案 0 :(得分:0)
您的代码存在许多问题。
<强> attr_accessor
强>
为什么使用attr_accessor
?您应该将值存储在数据库中的模型属性上。如果您的Field模型还没有farming_year
属性,请创建一个迁移,通过运行以下命令将其添加到数据库中:
$ rails g migration AddFarmingYearToField farming_year:integer
$ rails db:migrate
如果您正在运行Rails&lt; = 4,请使用rake db:migrate
而不是第二个命令。
这样做意味着您不需要使用attr_accessor
,或定义getter和setter。
<强> PlantingController#new
强>
此方法不适合您,因为您尚未定义正确的方法,并且您没有保存该实例。
在Field
模型中,您已经定义了farming_year
方法,但是您还没有定义farming_year=
方法,这就是设置器应该是什么。将您的farming_year
方法定义更改为farming_year=
。或者,使用我在 1。中描述的方法,然后你就不用了。
确保您在完成模型对象后保存模型对象 - 调用Field#save
,这会在成功时返回真值,在失败时返回虚假;或者调用Field#save!
,它会在成功时返回真值并在失败时引发异常。
答案 1 :(得分:0)
我的代码的主要问题是使用attr_accessor我并不需要它,所以,我已经取代了#34; attr_accessor:farming_year&#34;使用类变量&#34; @@ work_year =&#39;&#39;&#34;&#34;,并更新getter和setter方法,如下面的代码所示
Field模型:
class Field < ApplicationRecord
has_many :crops
attr_accessor :farming_year
@@work_year =''
def getting_crops
@crops_list = Crop.select('crops.name').where(field_id: self.id, year: farming_year) #now this can request the getter method and get the year
end
def farming_year # getter method
@@work_year ||= ''
end
def farming_year=(val) #setter method
@@work_year = val
end
end
在种植控制器中:
def new
@field = Field.new
@field.farming_year = session[:working_year]
#@field.save NO need for this line
flash.now[:success] = @field.farming_year
end
谢谢大家的支持:)