Ruby on rails 在本地运行应用程序时导致问题的STI

Ruby on rails 在本地运行应用程序时导致问题的STI,ruby-on-rails,ruby,ruby-on-rails-3,activerecord,Ruby On Rails,Ruby,Ruby On Rails 3,Activerecord,我目前正在开发RubyonRailsV4应用程序 我为两个子用户创建了一个表继承,buyer和seller,继承自主user表。由于这样做,在localhost:3000上运行应用程序时似乎出现了问题 作为新用户注册时,我在浏览器页面上遇到以下错误: NoMethodError in Home#main Showing /Users//Development/secret-project/app/views/layouts/home.html.erb where line #84 raised:

我目前正在开发RubyonRailsV4应用程序

我为两个子用户创建了一个表继承,
buyer
seller
,继承自主
user
表。由于这样做,在localhost:3000上运行应用程序时似乎出现了问题

作为新用户注册时,我在浏览器页面上遇到以下错误:

NoMethodError in Home#main
Showing /Users//Development/secret-project/app/views/layouts/home.html.erb where line #84 raised:
undefined method `seller' for User: 0x00000105714bb0
以下是home.html.erb中的代码:

        <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">`
家庭控制器代码为:

class HomeController < ApplicationController

  def main
    @search = Search.new
    @jobs = Product.where("")

    render :layout => 'home'
  end

  def index
    page = params.has_key?(:page)? params[:page].to_i : 1
    per_page = 20
  end

  def contact
     redirect_to :contact
  end
end
class HomeController'home'
终止
def索引
page=参数是否有_键?(:page)?参数[:页]。收件人:1
每页=20
终止
def触点
重定向到:联系人
终止
终止
我没有更新或做什么?我唯一能确定的是第84行不正确。我认为可能需要将其更改为:

<%= render_navigation :context => (current_user.blank? ? :guest : :user : :seller : :buyer) %>
(当前_user.blank???:来宾::用户::卖家::买家)%>
创建新用户时,默认情况下,它们不会存储为
卖家
,这让我感到困惑


我的改变有意义吗?还是我完全处于错误的位置

我会在这里使用好的ol'多态性。

最后一行很奇怪,因为它从一个条件分支成4条路径。这不仅仅是不可能的,这是一个语法错误。但它可以重写:

<%= render_navigation :context => (current_user.blank? ? :guest : current_user.role) %>
在子类中,重写它:

def role
  :buyer # or :seller, in the other class
end
这是一个如何使用STI的架构示例。在这种情况下,即使不覆盖以下内容,也可以很快解决此问题:

def role
  class.name.underscore.to_sym
end

不过,这确实需要一些额外的计算。你已经被警告过了。您还可以将此实现直接放入视图中
render_导航
在我看来非常像一个黑盒子,我不知道是否有更好的方法来处理这个问题。如果您提供了更多关于它的详细信息,请告诉我,以便我可以相应地更新答案。

欢迎使用堆栈溢出。需要记住的是,堆栈溢出是一个参考站点,而不是一个社交站点。当问问题时,试着按照你的格式中问题的一般外观和感觉,不要费心使用表情符号。想想一本稍微温和一点的百科全书,或者类似维基百科的东西,你会做得很好。
render_navigation
来自哪里?@nicooga在整个应用程序文件夹中搜索代码时,它只出现在我的两个视图文件中。这不是某种天生的命令吗?我不这么认为。谷歌把我送到这里。在您之前编写代码的人可能正在使用此gem呈现导航。看看吧,它可能会让你对什么地方出了问题有一些见解。@nicooga,你说得对!在查看了GEM文件后,我找到了它,它看起来像是上一个编码器用来简化分割不同用户视图和功能的工作。你认为这会导致很多未来的问题吗?有没有更好的方法来完成这项工作?谢谢尼科加!我在models:
def seller中的
User
类中添加了这个选项?self.user_type=='seller'结束def买方?self.user_type=='buyer'end
这有意义吗?它同样适用于STI类
Buyer
Seller
,但这是因为它使用的是旧方法。最后一个编码器只是将
user\u type
作为一列放在
user
表中,以区分两者。我听说STI是处理子用户类
Buyer
Seller
的正确方法?@RubyMax STI定义为共享父表的子类。是的。但是请记住,您仍然可以继承Ruby。
def role
  :buyer # or :seller, in the other class
end
def role
  class.name.underscore.to_sym
end