Ruby on rails 如何在Rails中调解创建操作

Ruby on rails 如何在Rails中调解创建操作,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,我当前有此操作来创建对象 def create @campaign = Campaign.create(params[:campaign]) respond_with(@campaign) end 由于我使用rails3 jquery autocomplete为用户输入用户名创建一个自动完成,因此我将用户名作为字符串接收,需要将其转换为id以将其保存为user\u id:integer 我不确定在触发create操作之前如何运行代码。您可以在用户模型中创建getter和sette

我当前有此操作来创建对象

def create 
  @campaign = Campaign.create(params[:campaign])
  respond_with(@campaign)
end  
由于我使用
rails3 jquery autocomplete
为用户输入用户名创建一个自动完成,因此我将用户名作为字符串接收,需要将其转换为id以将其保存为
user\u id:integer


我不确定在触发
create
操作之前如何运行代码。

您可以在用户模型中创建getter和setter方法,用于在分配时查找用户,如下所示:

def username
  user.name
end

def username=(name)
  self.user = User.find_by_name(name)
end
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
如果在用户模型中使用attr_accessible,请确保:username包含在内


同样为了澄清,这个示例依赖于jquery表单字段是否使用用户名,您可以在您的用户模型中创建getter和setter方法来查找分配时的用户,如下所示:

def username
  user.name
end

def username=(name)
  self.user = User.find_by_name(name)
end
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
如果在用户模型中使用attr_accessible,请确保:username包含在内


同样要澄清的是,这个示例依赖于jquery表单字段是否使用名称username

您可能希望在使用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
类活动控制器
您可能希望使用Rails提供的
before\u filter
方法

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
类活动控制器
您可以在创建方法中修改参数,如下所示:

def username
  user.name
end

def username=(name)
  self.user = User.find_by_name(name)
end
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中处理参数。

您可以在create方法中修改参数,如下所示:

def username
  user.name
end

def username=(name)
  self.user = User.find_by_name(name)
end
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所提到的,最好在:在过滤之前处理参数。

在“用户id=>”myusername中接收用户名的参数是什么?“用户id=>”myusername,在“用户id=>”myusername中接收用户名的参数是什么?“用户id=>”这是一种很好的分离“参数”处理的干净方法+1.一种很好的分离“参数”处理的干净方法+1.