我有一个用户填写的表单,在创建我的DB中的对象之前,我需要添加一些额外的“幕后”数据。例如,像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'做这件事最好的方法是什么?
谢谢!
发布于 2015-06-17 20:51:36
您可以在控制器中使用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发布于 2015-06-17 21:02:29
这对我起了作用:
user.rb
before_save :add_more_info
def add_more_info
self.referrer_url = create_url,
self.clout = calc_clout
end注意:我通常不会在模型中使用
self,但不知怎么的,这是使它与before_save回调一起工作的唯一方法
https://stackoverflow.com/questions/30902096
复制相似问题