2014-12-18 3 views
0

안녕하세요 저는 지난 8 개월 동안 레일스를 해킹하고 있으므로 여러 가지 사실을 이해하지 못합니다. 나는 current_user 등을 설정하는 도우미 메서드를 보았고 사용했다. 그리고 지금 비슷한 것을 복제하려고 시도하고있다.레일스가 세션 변수를 할당합니다.

사용자가있는 현재 회사의 응용 프로그램 컨트롤러에 전역 값을 설정하려고합니다. 내가 잘못하고 있음을 알고 있지만 해결 방법을 알아 내지 못합니다. 올바르게 접근하고 있어요. 사용자가 회사를 클릭하면 글로벌 변수가 회사의 ID로 설정됩니다. 그런 다음 다른 하위 모델에서 회사에 대한 정보를 원하면 전역 변수를 사용하여 해당 ID를 사용하여 회사 개체를 검색하십시오. 문제를 일으키는

코드는 내가 컨트롤러 등 회사를 사용하지만있을 때이 작동 application.html.erb

<li><%= link_to "Company", company_path, :method => :get %></li> 

내 네비게이션 바에 나는 다른 컨트롤러 I을 사용하려고 할 때 '

ActionController :: UrlGenerationError 종업원의 # 지수

오류를 받고 있어요

나는 회사 id 매개 변수가 전달되지 않으므로 URL을 렌더링 할 수 없다는 것을 이해합니다.

다른 프로젝트에서 (current_user를 가져 오기 위해) 사용한 도우미 메서드를 해킹하려했지만 세션을 사용하여 user.id를 추출하여 사용자 개체를 반환한다는 것을 깨달았습니다. 여기에 회사 ID가 매개 변수로 전달되지 않는 한 나의 방법은 위의 쓸모가 있도록 내가 세션에서 현재의 회사를 얻을 수 아니에요 application_controller.rb

def current_company 
    @company = Company.find_by_id(params[:id]) 
end 

에서 도우미 메서드에서 내 시도이다. 나는 모든 하위 모델 방법에 회사 ID를 전달 대해 생각했습니다

하지만

  1. 나는이 작업을 수행하는 방법을 100 % 확실하지 않다
  2. 그것은 매우 효율적 소리가 나지 않는다

내 질문에 올바르게 접근하고 있습니까? 최선의 방법은 무엇입니까? 사용자가 회사에 액세스하고 다른 모델에서 검색 할 수있게되면 글로벌 회사 ID 변수를 저장하는 도우미 메서드를 만들 수 있습니까?

설명이 너무 많아서 설명이나 추가 정보가 필요하면 알려주세요. 보고 주셔서 감사합니다.

편집 한

제작 루비 레이서 제안 변경하고 지금은이 :

application.html합니다.문이 잘했다 않는 current_company이 전무이기 때문에 ERB이 네비게이션 바에있는 링크를 표시하지 않습니다

<%unless current_page?(root_path)||current_page?(companies_path)||current_company.nil? %> 

    <li><%= link_to "Company", company_path, :method => :get %></li> 

, 내가 가정 (다른 두 내가 current_company.nil를 추가하기 전에?

내가하고 있어요

companies_controller.rb에서 current_company

before_action :set_company, only: [:show, :edit, :update, :destroy, :company_home] 

def company_home 
    current_company = @company 
    respond_with(@company) 
end 

application_controller.rb

def current_company=(company) 
    session[:current_company] = company.id 
    puts "The current_company has been assigned" 
    puts params.inspect 
end 

def current_company 
    @company = Company.find_by_id(session[:current_company]) 
    puts "The current_company helper has been called" 
    puts @company 
    puts params.inspect 
end 

내가 뭔가 잘못하고 있습니까?

편집 2

나는이 작동하지 않는 이유를 모르겠어요. 위의 편집을 마치면 session[:company_id]이 할당되지 않은 것처럼 보이므로 current_company 도우미 메서드가 nil을 반환합니다. 세션 매개 변수 puts session.inspect 인쇄를 시도했지만 company_id 정보를 찾을 수 없습니다. 왜 값을 할당하지 않는지 아무도 모른다.

편집

3 내 인생이 잘못 무슨 일이 일어나고 있는지 알아낼 수 없습니다하십시오. 회사 객체를 주어진되고있는 company_home 방법 (I 아래의 콘솔 출력에서 ​​볼 수

def company_home 
    puts "Test the current company" 
    puts "#{@company.id} #{@company.name}" 
    puts params.inspect 
end 

private 
    def set_company 
    @company = Company.find_by_id(params[:id]) 
    if @company.nil?||current_user.organisation_id != @company.organisation.id 
    flash[:alert] = "Stop poking around you nosey parker" 
    redirect_to root_path 
    else 
    current_company = @company 
    end  
    end 

: 지금은 다음과 같습니다 companies_controller.rbset_company 방법에 current_company = @company 이동 등의 여러 가지를 시도했습니다) 그러나 current_company 할당은 일어나지 않습니다. 여기서 라인 The current_company helper has been called 아래 puts @company 무언가를 출력한다 빈 행이 거기에, 상기 기준

으로 당
Started GET "/company_home/1" for 80.55.210.105 at 2014-12-19 10:26:49 +0000                          
Processing by CompaniesController#company_home as HTML                                
    Parameters: {"authenticity_token"=>"gfdhjfgjhoFFHGHGFHJGhjkdgkhjgdjhHGLKJGJHpDQs6yNjONwSyTrdgjhgdjgjf=", "id"=>"1"}                     
    User Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."id" = 6 ORDER BY "users"."id" ASC LIMIT 1                  
    Company Load (0.3ms) SELECT "companies".* FROM "companies" WHERE "companies"."id" = 1 LIMIT 1                     
    Organisation Load (0.3ms) SELECT "organisations".* FROM "organisations" WHERE "organisations"."id" = $1 LIMIT 1 [["id", 6]]             
Test the current company                                       
1 Cine                                            
{"_method"=>"get", "authenticity_token"=>"gfdhjfgjhoFFHGHGFHJGhjkdgkhjgdjhHGLKJGJHpDQs6yNjONwSyTrdgjhgdjgjf=", "controller"=>"companies", "action"=>"company_home", "id"=>"1"}       
    Rendered companies/company_home.html.erb within layouts/application (0.1ms)                          
    Company Load (0.6ms) SELECT "companies".* FROM "companies" WHERE "companies"."id" IS NULL LIMIT 1                    
The current_company helper has been called                                   

{"_method"=>"get", "authenticity_token"=>"gfdhjfgjhoFFHGHGFHJGhjkdgkhjgdjhHGLKJGJHpDQs6yNjONwSyTrdgjhgdjgjf=", "controller"=>"companies", "action"=>"company_home", "id"=>"1"}       
    CACHE (0.0ms) SELECT "organisations".* FROM "organisations" WHERE "organisations"."id" = $1 LIMIT 1 [["id", 6]]                
Completed 200 OK in 280ms (Views: 274.0ms | ActiveRecord: 1.7ms) 

대한 콘솔 출력이다. 이것은 current_company 메소드가 아무 것도 반환하지 않는다는 것을 의미합니다.

또한 companies_controller의 company_home 메서드에서 puts "#{@company.id} #{@company.name}"puts "#{current_company.id} #{current_company.name}"으로 변경하면 오류가 발생합니다.

def current_company=(company)이 세션 매개 변수를 지정하지 않는 이유가 누구에게 있습니까?감사합니다

최종 편집

나는 아무 생각 왜했습니다 없지만,이 관련된 문제가 나타납니다 :이 호출되지 없구요 것처럼

def current_company=(company) 
    session[:current_company] = company.id 
    puts "The current_company has been assigned" 
    puts params.inspect 
end 

그것은 보인다. 나는 전에 이런 것을 사용 해본 적이없는 이유를 이해하지 못합니다.

답변에 답을 달아 드리겠습니다.

+0

예, 소환되는'세션 주위에 액세스 할 수 있습니다 ]' –

+0

'session [: company_id]'로 변경했지만 여전히 작동하지 않습니다. –

+0

'rails_root/config/initializers/session_store.rb' 파일이 있습니까? 그렇다면 주석 처리되지 않은 행이 있습니까? –

답변

2

네, 두 가지 작업을 수행해야합니다.

우선, 당신은 당신의 company.id 변수 세션

def current_company=(company) 
    session[:company_id]=company.id 
end 

두 번째로 할당 할 필요로 할 것이다 current_company에 대한 도우미 방법은 다음과 같습니다

def current_company 
    Company.find_by_id(session[:company_id]) 
end 

이 될 수있는 경우 무기 호 session[:company_id] 또는 회사에 해당하지 않는 경우. 괜찮아요 ...

인덱스와 쇼 작업 모두에 /companies을 사용하는 경우, ID가 없으면 작동하지 않을 가능성이 높습니다.

이제 첫 번째 작업을 위해.

컨트롤러 : companies_controller.rb 당신이 당신의 메뉴 바는 당신의 current_company로 이어질하려면 작성해야합니다

def show 
    # assuming you have a before_action, something like set_company, no need to redo it 
    [email protected] # this will set the session variable 
end 

가 :

<% unless current_company.nil? %> 
    <li><%= link_to "Company", current_company, :method => :get %></li> 
<% end %> 

내가 무엇을 모르는 변수를 설정 현재 회사가 없다면 당신은하고 싶다. 그래서 나는 그냥 버린다.

+0

고마워요.하지만 여전히 일할 수 없습니다. –

+0

@AlD In Rails 자습서 Michael Hartl은 비슷한 기술을 사용하여'current_user'를 정의했습니다. 이것을 확인하십시오 : https://github.com/mhartl/sample_app_4_0_upgrade/blob/master/app/helpers/sessions_helper .rb –

+0

방금 ​​D 측에서 소식을 알았습니다. 이 고맙습니다. –

0

도우미 메서드를 사용하여 회사를 지정하거나 검색하는 대신 set_company 메서드에서 세션 변수를 companies_controller.rb에 할당했습니다. [: ID]`정말`세션 [액세스해야하는 경우 : COMPANY_ID 이것은 다음 응용 프로그램

companies_controller.rb

private 
    def set_company 
     @company = Company.find_by_id(params[:id]) 

     if @company.nil?||current_user.organisation_id != @company.organisation.id 
      redirect_to root_path 
     else 
      session[:current_company] = @company 
      current_company = @company 
     end  
    end 
관련 문제