0

我无法理解我的这不起作用。当用户创建新页面(使用 Ruby on Rails)时,我正在尝试添加一种方法来从页面标题创建 slug。

这是我的创建方法:

  def create
@page = Page.new(params[:page])
@page.user_id = current_user.id
@page.slug = @page.title.to_slug

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

结尾

这是我在同一个控制器底部的方法。(pages_controller.rb):

    def to_slug(param=self.slug)

    # strip the string
    ret = param.strip

    #blow away apostrophes
    ret.gsub! /['`]/, ""

    # @ --> at, and & --> and
    ret.gsub! /\s*@\s*/, " at "
    ret.gsub! /\s*&\s*/, " and "

    # replace all non alphanumeric, periods with dash
    ret.gsub! /\s*[^A-Za-z0-9\.]\s*/, '-'

    # replace underscore with dash
    ret.gsub! /[-_]{2,}/, '-'

    # convert double dashes to single
    ret.gsub! /-+/, "-"

    # strip off leading/trailing dash
    ret.gsub! /\A[-\.]+|[-\.]+\z/, ""

    ret
  end

slug 方法来自这个问题: Best way to generate slugs (human-readable IDs) in Rails

我不明白为什么这会产生方法未定义的错误或如何修复它。任何帮助,提示或答案表示赞赏。:)

4

1 回答 1

1

to_slug方法是 PagesController 类的实例方法。该对象@page.title没有此方法,这就是代码不起作用的原因。

有几种方法可以使该方法to_slug起作用,例如助手、装饰。但我认为最好的方法是将这样的逻辑放入模型中,因为slug它实际上是模型的一部分。我们将slug在保存(创建和更新)之前立即使属性可用。

所以,在Page模型中。假设您已经有slug属性。

第 1 步:设置回调

before_saving :update_slug  # for create record, before actual saving

第 2 步:update_slug 方法

def update_slug  
  ret = self.title # Use title variable directly
  # .... You to_slug code. Almost same.
  self.slug = ret # return slug
end

以上是提供思路的基本思路,尚未验证。请自行检查和验证。希望有帮助。

于 2013-04-13T15:47:56.683 回答