RoR:来自不相关控制器

时间:2016-09-13 12:16:50

标签: ruby-on-rails

我需要将一个值传递给来自不同控制器的模型中的属性,它们之间没有直接关系。在下面的例子中,我需要从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方法。

提示:框架年份属于裁剪而不属于字段,因此我无需将其添加到字段表中。

任何想法如何实现?

2 个答案:

答案 0 :(得分:0)

您的代码存在许多问题。

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

  2. <强> PlantingController#new

    此方法不适合您,因为您尚未定义正确的方法,并且您没有保存该实例。

    Field模型中,您已经定义了farming_year方法,但是您还没有定义farming_year=方法,这就是设置器应该是什么。将您的farming_year方法定义更改为farming_year=。或者,使用我在 1。中描述的方法,然后你就不用了。

  3. 确保您在完成模型对象后保存模型对象 - 调用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

谢谢大家的支持:)