繁体   English   中英

RoR:从不相关的控制器更新模型中的属性

[英]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方法。

提示:框架年份属于“作物”而不是“字段”,因此不需要将其添加到“字段”表中。

有什么想法要实现吗?

您的代码有很多问题。

  1. 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。

  2. 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM