未定义的方法'下划线'

时间:2016-07-28 08:24:53

标签: ruby-on-rails single-table-inheritance

我正在使用Thibault的教程{S = {3}}

尝试使用STI

一直工作正常,直到动态路径部分我得到'未定义方法`下划线'为nil:NilClass'为此片段

def format_sti(action, type, post)
    action || post ? "#{format_action(action)}#{type.underscore}" : "#{type.underscore.pluralize}"
end

路线:

    resources :blogs, controller: 'posts', type: 'Blog' do 
          resources :comments, except: [:index, :show]
    end
    resources :videos, controller: 'posts', type: 'Video'
    resources :posts

邮政控制人:

    before_action :set_post, only: [:show, :edit, :update, :destroy]
    before_action :set_type
    def index
        @posts = type_class.all
    end
    ...
    private 

    def set_type
        @type = type
    end

    def type
        Post.types.include?(params[:type]) ? params[:type] : "Post"
    end

    def type_class
        type.constantize
    end

    def set_post
        @post = type_class.find(params[:id])
    end

帖子助手:

    def sti_post_path(type = "post", post = nil, action = nil)
        send "#{format_sti(action, type, post)}_path", post 
    end

    def format_sti(action, type, post)
        action || post ? "#{format_action(action)}#{type.underscore}" : "#{type.underscore.pluralize}"
    end

    def format_action(action)
        action ? "#{action}_" : ""
    end

发布index.html

    <% @posts.each do |p| %>

    <h2><%= p.title %></h2>
    Created at: <%= p.created_at %><BR>
    Created by: <%= p.user.name %><P>
    <%= link_to 'Details', sti_post_path(p.type, p) %><P>
    <% end %>

当我尝试访问index.html时出现错误,我还没有尝试过其他链接。我试过删除'下划线',然后'_path'成为一个未定义的方法。我也尝试了其他建议,例如'gsub',但它也将它显示为未定义的方法,这使我认为这是一个语法错误......

更新 我有attr_accessor:类型,并使'type'为零。所以我删除了它,现在它正在工作

2 个答案:

答案 0 :(得分:0)

在你的PostsHelper.rb

def format_sti(action, type, post)
    action || post ? "#{format_action(action)}#{type.underscore}" : "#{type.underscore.pluralize}"
end

此方法的其他部分有类型 .underscore。 类型可能在这里为零。要验证它,请尝试:

def format_sti(action, type, post)
    action || post ? "#{format_action(action)}#{type.underscore}" : "#{"post".underscore.pluralize}"
end

答案 1 :(得分:0)

尝试使用try命令,该命令不会返回NoMethodError exception,而是返回nil,

def format_sti(action, type, post)
    action || post ? "#{format_action(action)}#{type.try(:underscore)}" : "#{type.try(:underscore).pluralize}"
end

定义:   使用try,如果接收对象是nil对象或NilClass,则不会引发NoMethodError异常并返回nil。

Here is the reference