簡體   English   中英

從Rails中的表單提交之前,如何在模型中添加額外的數據

[英]How do I add extra data to model before submit from form in Rails

我有一個用戶填寫的表單,需要在數據庫中創建對象之前向其添加一些“幕后”數據。 例如,諸如referrer_url, clout_score等數據。我該如何去做? 方法應該放在控制器或模型中嗎?

例如,我需要能夠將create_url方法返回的內容添加到中:

users_controller.rb

class UsersController < ApplicationController
  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)
      if @user.save
        flash[:success] = "You've been added to the waiting list!"
        render 'show'
      else
        render 'new'
      end
  end

  private
    def user_params
      params.require(:user).permit(:name, :email, :use_type)
    end

    def create_url
     url = SecureRandom.hex(4)
    end

結束

數據庫中的用戶表

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :name
      t.string :email
      t.integer :init_spot
      t.integer :current_spot
      t.string :referrer_url
      t.integer :clout

      t.timestamps null: false
    end
  end
end

我是否應該在同一控制器操作中執行@user.update_attributes並以這種方式調用我的方法? 喜歡:

if @user.save
      @user.update_attributes(referrer_url: create_url, clout: calc_clout, etc.)
      flash[:success] .....
      render 'new'

做到這一點的最佳方法是什么?

謝謝!

您可以在控制器中使用ActiveRecord::Core#new方法的哈希選項:

@user = User.new(user_params.merge(referrer_url: create_url))

或將所有內容移到一個單獨的方法中,以獲取更清晰,更易讀的代碼:

@user = User.new(user_params_with_additional_data)

private

def user_params_with_additional_data
  user_params.merge(referrer_url: create_url)
end

這對我有用:

user.rb

before_save :add_more_info

def add_more_info
  self.referrer_url = create_url, 
  self.clout = calc_clout 
end

請注意,我通常不在模型中使用self ,但是以某種方式,這是我可以使其與before_save回調一起使用的唯一方法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM