未定义的方法 'underscore'
Undefined Method 'underscore'
我正在使用 Thibault 的教程尝试 STI:https://samurails.com/tutorial/single-table-inheritance-with-rails-4-part-3
它一直运行良好,直到动态路径部分我得到 'undefined method `underscore' for nil:NilClass' for this snippet
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
Post 控制器:
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
Posts 帮手:
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
Post 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时出现错误,我还没有尝试其他链接。我尝试删除 'underscore',然后“_path”变成未定义的方法。我还尝试了其他建议,例如 'gsub',但它也将其显示为未定义的方法,这让我认为这是一个语法错误...
更新:
我有 attr_accessor :type 并且 'type' 为零。所以我删除了它,现在它正在工作
在你的PostsHelper.rb
def format_sti(action, type, post)
action || post ? "#{format_action(action)}#{type.underscore}" : "#{type.underscore.pluralize}"
end
此方法的其他部分具有 类型.下划线。 type 此处可能为 nil。要验证它,试试这个:
def format_sti(action, type, post)
action || post ? "#{format_action(action)}#{type.underscore}" : "#{"post".underscore.pluralize}"
end
试试 try
命令,它不会 return NoMethodError exception
而是 return nil,
def format_sti(action, type, post)
action || post ? "#{format_action(action)}#{type.try(:underscore)}" : "#{type.try(:underscore).pluralize}"
end
定义:
使用 try
,如果接收对象是 nil 对象或 NilClass,则不会引发 NoMethodError 异常,而是 returned nil。
我正在使用 Thibault 的教程尝试 STI:https://samurails.com/tutorial/single-table-inheritance-with-rails-4-part-3
它一直运行良好,直到动态路径部分我得到 'undefined method `underscore' for nil:NilClass' for this snippet
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
Post 控制器:
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
Posts 帮手:
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
Post 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时出现错误,我还没有尝试其他链接。我尝试删除 'underscore',然后“_path”变成未定义的方法。我还尝试了其他建议,例如 'gsub',但它也将其显示为未定义的方法,这让我认为这是一个语法错误...
更新: 我有 attr_accessor :type 并且 'type' 为零。所以我删除了它,现在它正在工作
在你的PostsHelper.rb
def format_sti(action, type, post)
action || post ? "#{format_action(action)}#{type.underscore}" : "#{type.underscore.pluralize}"
end
此方法的其他部分具有 类型.下划线。 type 此处可能为 nil。要验证它,试试这个:
def format_sti(action, type, post)
action || post ? "#{format_action(action)}#{type.underscore}" : "#{"post".underscore.pluralize}"
end
试试 try
命令,它不会 return NoMethodError exception
而是 return nil,
def format_sti(action, type, post)
action || post ? "#{format_action(action)}#{type.try(:underscore)}" : "#{type.try(:underscore).pluralize}"
end
定义:
使用 try
,如果接收对象是 nil 对象或 NilClass,则不会引发 NoMethodError 异常,而是 returned nil。