我目前正在开发Ruby on Rails v4应用程序。
我为两个子用户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">`
第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
,这就让我感到困惑。
我的改变是否有意义,或者我完全在错误的位置?
答案 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
对我来说就像一个黑盒子,我无法判断是否有更好的方法来解决这个问题。如果您提供更多详细信息,请告诉我,以便我可以相应地更新答案。