簡體   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