ruby-on-rails - 如何在 Rails 中传递动态参数?

我希望我的一些模型属性动态预定义。我有各种模型。现在我希望我的 Bill 模型使用其他模型实例创建对象。

楷模 :

    leave.rb        # belongs_to :residents
    resident.rb     # has_many:leaves,has_many:bills,has_one:account
    bill.rb         # belongs_to:residents
    rate_card.rb    # belongs_to:hostel
    account.rb      # belongs_to:resident
    hostel.rb       

现在这是我的账单 Controller 创建方法:
def create
    @bill = Resident.all.each { |resident| resident.bills.create(?) }
    if @bill.save
      flash[:success]="Bills successfully generated"
    else
      flash[:danger]="Something went wrong please try again !"
    end
  end

我想使用所有模型 建立账单,例如:
resident.bills.create(is_date:using form,to_date:using form,expiry_date:using form,amount:30*(resident.rate_card.diet)+resident.rate_card.charge1+resident.rate_card.charge2)+(resident.account.leaves)*10+resident.account.fine)
///////Is this possible ?

以及如何在这里使用强参数?

请帮我解决thxx ..

最佳答案

我认为你想要的这个逻辑的 Rails 方式是使用 callbacks 如果你想要在 create update delete 上计算属性,这意味着依赖于其他模型的属性。例如:

class Bill < ActiveRecord::Base
  ...
  before_create :set_amount

  ...

  protected

    def set_amount
      self.amount = 30 * self.resident.rate_card.diet + self.resident.rate_card.charge1 + self.resident.rate_card.charge2 + (self.resident.account.leaves) * 10 + self.resident.account.fine
    end
end

如果您还希望在更新记录时使用此逻辑,那么您应该使用 before_save 而不是 before_create

执行此操作后,您应该接受 Bill 模型的常用参数(强),如下所示:
def bill_params
  params.require(:bill).permit(:is_date, :to_date, :expiry_date)
end

所以你的 create 调用会是这样的:
resident.bills.create(bill_params)

此外,请注意您的 create 操作 ,您可能应该在 BillResident 模型上创建一个方法,该方法使用事务同时创建所有账单,因为您可能希望创建每个账单或不创建。这样你的 Resident.all.each 中就不会有 BillsController 逻辑。