[英]RoR: Update attribute in a model from a unrelated controller
我需要將值傳遞給來自其他控制器的模型中的屬性,它們之間沒有直接關系。 在下面的示例中,我需要從Planting控制器更新Field Model中的farming_year。
現場模型:
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方法轉換為get_crops方法。
提示:框架年份屬於“作物”而不是“字段”,因此不需要將其添加到“字段”表中。
有什么想法要實現嗎?
您的代碼有很多問題。
attr_accessor
為什么要使用attr_accessor
? 您應該將值存儲在數據庫中的模型屬性上。 如果您的Field模型還沒有farming_year
屬性,請通過運行以下命令來創建遷移以將其添加到數據庫中:
$ rails g migration AddFarmingYearToField farming_year:integer $ rails db:migrate
如果您正在運行Rails <= 4,請使用rake db:migrate
而不是第二條命令。
這樣做意味着您不需要使用attr_accessor
或定義getter和setter。
PlantingController#new
該方法不適用於您,因為您尚未定義正確的方法,並且您沒有保存實例。
在您的Field
模型中,您已經定義了farming_year
方法,但是尚未定義farming_year=
方法,即設置方法應為。 將您的farming_year
方法定義更改為farming_year=
。 另外,也可以使用我在1.中描述的方法,而不必這樣做。
確保完成后保存模型對象-調用Field#save
,成功后返回真值,失敗時返回真值; 或致電Field#save!
,成功則返回真實,失敗則引發異常。
我的代碼的主要問題是使用了我不需要的attr_accessor,因此,我用類變量“ @@ work_year =”“替換了” attr_accessor:farming_year“,並更新了getter和setter方法,如下所示下面的代碼
現場模型:
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
謝謝大家的支持:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.