2014-12-19 3 views
1

현재 Ruby on Rails v4 응용 프로그램을 작성 중입니다.응용 프로그램을 로컬에서 실행할 때 STI가 발생합니다

buyerseller에 대해 하나의 테이블 상속을 만들었으며 기본 user 테이블을 상속 받았습니다. 이후 localhost : 3000에서 응용 프로그램을 실행할 때 문제가있는 것으로 보입니다.

내가 브라우저 페이지에서 다음과 같은 오류 얻을 새 사용자로 가입하는 경우 :

 <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">` 

라인 # 84 : 여기

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의 코드입니다<%= 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 줄이 잘못되었습니다. 그들은 기본적으로 Seller로 저장되지 않은 새 사용자를 만들 때

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

이 나를 혼란 것입니다 : 나는 그것을 변경해야 할 수 있습니다 생각하고 있어요.

내 변경 사항이 의미가 있거나 잘못된 위치에 있습니까?

+1

스택 오버플로에 오신 것을 환영합니다. 기억해야 할 점은 스택 오버플로는 소셜 사이트가 아닌 참조 사이트라는 것입니다.질문 할 때 서식의 평균 모양과 느낌을 따르고 이모티콘을 신경 쓰지 마십시오. 약간 더 친절하고 부드러운 백과 사전이나 Wikipedia의 라인을 따라 생각해 보면 잘 할 수 있습니다. –

+0

'render_navigation'은 어디에서 왔습니까? – nicooga

+0

@nicooga 전체 응용 프로그램 폴더 내에서 코드를 검색 할 때 내보기 파일 중 2 개만 표시됩니다. 어떤 종류의 내장 명령이 아닌가? – RubyMax

답변

0

여기서는 좋은 ol '다형성을 사용합니다.

마지막 줄은 단지 하나의 조건에서 4 개의 줄로 분기되므로 이상합니다. 그것은 단지 불가능하지 않습니다. 구문 오류입니다. 그러나 다음과 같이 다시 쓸 수 있습니다 :

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

당연히, 그것은 독자적으로 작동하지 않습니다.

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

이 STI의 사용을 만드는 방법의 건축 예입니다 : 당신은 그것을 무시, 서브 클래스에서 User

def role 
    :user 
end 

로 시작, 첫 role를 정의 할 필요가 것입니다. 이 정확한 경우에는 재정의하지 않고도 매우 빨리 해결할 수 있습니다.

def role 
    class.name.underscore.to_sym 
end 

다소의 계산이 필요합니다. 너는 경고 당했다. 이 구현을 뷰로 바로 던질 수도 있습니다. render_navigation 꽤 많이 보입니다 블랙 박스 저에게 이걸 처리하는 더 좋은 방법이 있는지 알 수는 없어요. 그것이 무엇인지 자세히 설명해 주시면 알려 주시면 답변을 적절히 업데이트 할 수 있습니다.

+0

models :'def seller? '의'User' 클래스에 이것을 추가 했습니까? self.user_type == '판매자' end def 구매자가 맞습니까? self.user_type == '구매자' end' 의미가 있습니까? STI 클래스'Buyer'와'Seller'에서 다시 작동합니다.하지만 그것은 오래된 메소드를 사용하고 있기 때문입니다. 마지막 코더는 'user_type'을'User' 테이블의 컬럼으로 두어 두 테이블을 구별합니다. STI가 하위 사용자 클래스 인'Buyer'와'Seller'를 다루는 적절한 방법이라고 들었습니까? – RubyMax

+0

@RubyMax STI는 정의상 부모의 테이블을 공유하는 서브 클래스를 의미합니다. ** 예 **입니다. 그래도 루비로부터 상속을 받았다는 것을 명심하십시오. –

관련 문제