在本地运行应用程序时STI导致问题

时间:2014-12-19 17:00:01

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord

我目前正在开发Ruby on Rails v4应用程序。

我为两个子用户buyerseller创建了一个表继承,继承自主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">`

第84行 <%= render_navigation :context => (current_user.blank? ? :guest : :user) %> <%= render_navigation :expand_all => true, :context => :auth %> </div><!-- /.navbar-collapse --> </div><!-- /.container-fluid -->

浏览器还提供了以下详细信息:

app/views/layouts/home.html.erb:84:in '_app_views_layouts_home_html_erb___4408338611430956041_2173428480'
app/controllers/home_controller.rb:7:in `main'

home_controller代码是:

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

我没有更新或完成什么?我能解决的唯一问题是第84行不正确。我认为可能需要改为:

<%= render_navigation :context => (current_user.blank? ? :guest : :user : :seller : :buyer) %>

创建新用户时,默认情况下它们不会存储为Seller,这就让我感到困惑。

我的改变是否有意义,或者我完全在错误的位置?

1 个答案:

答案 0 :(得分:0)

我使用好的ol&#39;多态性在这里。

你的最后一行是奇怪的,因为它从一个条件分支到4个路径。它甚至不仅仅是不可能的,它是一个语法错误。但它可以改写:

<%= render_navigation :context => (current_user.blank? ? :guest : current_user.role) %>

当然,它不仅仅是单独工作。您需要先定义role,然后从User

开始
def role
  :user
end

在子类中,覆盖它:

def role
  :buyer # or :seller, in the other class
end

这是如何使用STI的架构示例。在这种情况下,即使没有覆盖,也可以很快解决这个问题:

def role
  class.name.underscore.to_sym
end

但确实需要一些额外的计算。你已被警告过了。您还可以将此实现直接投入到视图中。 render_navigation对我来说就像一个黑盒子,我无法判断是否有更好的方法来解决这个问题。如果您提供更多详细信息,请告诉我,以便我可以相应地更新答案。