我目前有这个动作来创建一个对象。
def create
@campaign = Campaign.create(params[:campaign])
respond_with(@campaign)
end
由于我正在使用rails3-jquery-autocomplete
为用户创建自动完成以输入用户名,因此我将用户名作为字符串接收,我需要将其转换为 id 以将其保存为user_id:integer
.
我不确定如何在create
触发操作之前运行代码。
我目前有这个动作来创建一个对象。
def create
@campaign = Campaign.create(params[:campaign])
respond_with(@campaign)
end
由于我正在使用rails3-jquery-autocomplete
为用户创建自动完成以输入用户名,因此我将用户名作为字符串接收,我需要将其转换为 id 以将其保存为user_id:integer
.
我不确定如何在create
触发操作之前运行代码。
您可能想使用before_filter
Rails 提供的方法。
class CampaignsController < ApplicationController
before_filter :intercede, only: :create
# some other actions here
def create
@campaign = Campaign.create(params[:campaign])
respond_with(@campaign)
end
private
def intercede
# let's do some hacking with params here
end
end
您可以在 User 模型中创建 getter 和 setter 方法来查找分配的用户,如下所示:
def username
user.name
end
def username=(name)
self.user = User.find_by_name(name)
end
如果您在用户模型中使用 attr_accesible,请确保包含 :username。
还要澄清一下,此示例依赖于 jquery 表单字段使用名称 username
您可以像这样修改 create 方法中的参数:
def create
# preprocess params
user = User.find_by_name(params[:campaign][:user_id])
params[:campaign][:user_id] = user.id
# Now create the record
@campaign = Campaign.create(params[:campaign])
respond_with(@campaign)
end
但正如 gmile 所提到的,最好在 :before_filter 中对参数进行这种处理。