页面控制器中未定义的方法 to_slug

Posted

技术标签:

【中文标题】页面控制器中未定义的方法 to_slug【英文标题】:Undefined method to_slug in Page controller 【发布时间】:2013-04-06 00:51:36 【问题描述】:

我无法理解我的这不起作用。我正在尝试添加一种方法,以便在用户创建新页面(使用 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

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

【问题讨论】:

【参考方案1】:

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

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

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

第 1 步:设置回调

before_saving :update_slug  # for create record, before actual saving

第二步:update_slug 方法

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

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

【讨论】:

以上是关于页面控制器中未定义的方法 to_slug的主要内容,如果未能解决你的问题,请参考以下文章

AngularJS模态对话框表单对象在控制器中未定义

rails动作控制器中未定义的方法“devise_for”

Rails 5 API 控制器中未定义的实例方法“respond_to”

JBuilder中未定义的局部变量或方法“json”

Swift 中未调用 UICollectionView DidDeselectItemAtIndexPath 方法

Laravel 8 中未定义动作 Controller@store 的问题