如何避免在控制器的创建方法中创建一些属性?

时间:2017-02-06 12:33:27

标签: ruby-on-rails ruby-on-rails-5

我有一个这样的模型:

class Url < ApplicationRecord
  validates ...
  before_create :generate_number

  def generate_number
    self.number = a random value
  end
end

和控制器中的create()方法:

def create
  @url = Url.new(url_params)

  respond_to do |format|
    if @url.save
      format.html { redirect_to @url, notice: 'Url was successfully created.' }
      format.json { render :show, status: :created, location: @url }
    else
      format.html { render :new }
      format.json { render json: @url.errors, status: :unprocessable_entity }
    end
  end
end

我的数据库只有两个字段:given_urlnumber。现在,当我转到new页面时,given_urlnumber有2个输入表单。但我希望numbergenerate_number获取值,而不是从表单中获取值。我怎么能这样做?

或者更具体一点,是否有办法让应用已经从用户输入中获取值后,generate_number方法覆盖用户的输入?

2 个答案:

答案 0 :(得分:1)

好吧,我找到了解决这个问题的方法。正如@ts在评论中提到的那样,我将before_create :generate_number更改为after_create :generate_number并将添加 self.save更改为generate_number方法的末尾:

def generate_number
  ...
  self.number = some number
  self.save
end

答案 1 :(得分:1)

您可以使用强参数

简单地限制用户的输入
def url_params
  params.require(:url).permit(:other, :params)
end