2016-10-08 6 views
0

私はSHOWアクション(ユーザー/ show.html.erbでの許可の管理ボタン)にアクセスしようとするとこのエラーが発生します。特定のユーザーのすべての許可を表示するはずです。私はすべてのコードを検索して、そのバグを見つけることができませんでした。あなたは私が間違っていた部分を確認する手助けをしてくれますか?ところで、私はこれが私のpermits_controller.rbあるActiveRecord :: RecordNotFoundでPermitsController#show、 'id'で許可が見つかりませんでした=

class PermitsController < ApplicationController 
    before_action :set_permit, only: [:show, :destroy] 
    def index 
    @permits = Permit.where(:user_id => current_user.id) 
    end 

    def new 
    @permits = Permit.new 
    end 

    def create 
    @permits = current_user.permits.build(permit_params) 
    if @permits.save 
     redirect_to invoice_path 
    else 
     render 'new' 
    end 
    end 


    def destroy 
    Permit.destroy_all(user_id: current_user) 
    respond_to do |format| 
     format.html { redirect_to root_path, notice: 'Permit was successfully canceled.' } 
     format.json { head :no_content } 
    end 
    end 

    def confirm 
    @fields = %i[vehicle_type, carplate, studentid, name, department, permitstart, permitend] 
    @permit = current_user.permits.build(permit_params) 
    render :new and return unless @permit.valid? 
    end 



    def show 
    @permits = Permit.where(:user_id => current_user.id) 


    end 

    def update 
    @permits = Permit.where(user_id: current_user).take 
    respond_to do |format| 
     if @permits.update(permit_params) 
     format.html { redirect_to root_path} 
     flash[:success] = "Permit successfully updated" 
     format.json { render :show, status: :ok, location: @user } 
     else 
     format.html { render :edit } 
     format.json { render json: @user.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    def edit 
    @permits = Permit.find(params[:id]) 
    #@permits = Permit.find_or_initialize_by(user_id: params[:id]) 
    end 

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_permit 
    @permits = Permit.find(params[:id]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def permit_params 
    params.require(:permit).permit(:vehicle_type, :name, :studentid, :department, :carplate, :duration, :permitstart, :permitend) 
    end 
end 

レール

上のRubyを使用して、ウェブサイトを実装していますこれは、これは私のルートである私の許可/ show.html.erb

<%= @permits.name %> 

です。デシベル

Rails.application.routes.draw do 
    resources :users 
    resources :permits do 
    collection do 
     post :confirm 
    end 
    end 
    resources :visitor_permits 
    root 'static_pages#home' 
    get 'invoice' => 'permits#invoice' 
    get 'payment' =>'transaction#new' 
    get 'show_visitor_permit' =>'visitor_permits#show' 
    get 'show_permit' =>'permits#show' 
    get 'visitorpermit' => 'visitor_permits#new' 
    post 'createpermit' => 'permits#create' 
    get 'homepage/index' 
    post 'permits' => 'permits#create' 
    get 'permitapplication' => 'permits#new' 
    get 'adminlogin' => 'admin_controller#index' 
    get 'patrollogin' => 'patrol_officer_controller#index' 
    get 'createcitation' => 'citations#new' 
    get 'contact'=> 'static_pages#contact' 
    get 'about' => 'static_pages#about' 
    get 'signup' => 'users#new' 
    get 'help' => 'static_pages#help' 
    post 'users' => 'users#create' 
    get 'login' => 'sessions#new' #Page for a new session 
    post 'login' => 'sessions#create' #Create a new session 
    delete 'logout'=>'sessions#destroy' #Delete a session 


    # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html 
end 

ユーザー/ show.html.erb

許可を設定する際に許可証がDBで id特定と存在しない場合
<!DOCTYPE html> 
<html> 
<body> 

<div id="sidebar"> 
<ul id="mySidenav" class="sidenav"> 
    <li><%= link_to "New Parking Permit", permitapplication_path %></li> 
    <li><%= link_to "Manage Permit", show_permit_path(@permit) %></li> 
    <li><%= link_to "New Visitor Parking Permit", visitorpermit_path %></li> 
    <li><%= link_to "Manage Visitor Permit", "#" %></li> 
    <li><%= link_to "Check Fines", "#" %></li> 
    <li><%= link_to "New Health and Safety Report", "#" %></li> 
    <li><%= link_to "Manage Health and Safety Report", "#" %></li> 
</ul> 
</div> 


</body> 
</html> 
+0

私は 'link'をクリックして特定の' Permit'に行くと思います。あなたはそのリンクを投稿できますか? – Emu

答えて

2

のように設定できます。まず、before_actionで:showメソッドを削除すると、2つのクエリが呼び出されます。

次に、アクティブレコードクエリ(以下のように)に条件を追加すると、単一レコードではなくレコードの配列になります。

@permits = Permit.where(:user_id => current_user.id) 

オブジェクトの配列が直接nameパラメータにアクセスすることを許可しないので、以下の行をビューに直接入れることはできません。

<%= @permits.name %> 

以下のようなすべてのレコードを繰り返し処理して、すべてのPermitオブジェクトの名前を入力できますか。

<% @permits.each do |permit| %> 
    <%= permit.name %> 
<% end %> 

また、次のようにカンマ区切りで表示することもできます。

<%= @permits.map { |f| f.name }.join ',' %> 

@permitsの最初のオブジェクトだけを使用する場合は、以下のように使用できます。

<%= @permits[0].name %> 

P.S:最初のオブジェクトが存在しない場合は例外をスローすることに注意してください。

+0

回答者のおかげで!私はあなたのソリューションを試してみますが、私はすべてのレコードを反復し、許​​可オブジェクトのデータを取り込む方法に興味があります。それを実現するために私は何を入力する必要がありますか? –

+0

私は私の答えを編集しています。それをチェックしてオブジェクトを反復する。 – Jayaprakash

+0

ありがとう、それは魅力のように動作します! –

2

PermitsControllerでは、それは例外が発生します、

before_action :set_permit, only: [:show, :destroy] 


    def set_permit 
    @permits = Permit.find(params[:id]) 
    end 

ので、許可を設定するアクションの前に書いてきているActiveRecord::RecordNotFound

あなたはまた、ショーアクションの許可を設定しています

def show 
    @permits = Permit.where(:user_id => current_user.id) 
    end 

peを設定する理由がわかりませんショーアクションのために2回rmits。 - set_permit方法 で初めて - show方法

で2回目は、あなたは、要求に渡している問題のパラメータを追加してくださいすることができます。

レコードを2回割り当てるのは良い方法ではありません。あなたのケースでは、Permitidであり、その特定のレコードがidでない場合、データベースにはActiveRecord::RecordNotFound例外が発生します。あなたはあなたが渡しているものをparams[:id]でチェックしなければなりません。

現在のユーザーに基づいて許可を設定する場合は、表示アクションとしてset_permitをスキップできます。

activerecord collectionの代わりにactive recordを割り当てている場合は、その場合はコレクションオブジェクトを反復してpermitの詳細を印刷する必要があります。または、ユーザーに対して1つの許可がある場合は、の代わりにactive recordオブジェクトをactive record collection

+0

繰り返しが問題の原因ですか?私はbefore_actionがどのように動作するのか分かりません。私はステップバイステップガイドに従っているからです。私はそれを動作させるbefore_actionからshow:を削除しようとしました。あなたはショーアクションでの設定許可がbefore_actionと同じであると主張していますか? –

+0

@GaryVlcいいえ - 繰り返しは問題ではありません - 実際に繰り返すのは良い方法ではありません。あなたのケースでは 'id'で' Permit'を見つけていて、その特定の 'id'のレコードがデータベースに存在しない場合、' ActiveRecord :: RecordNotFound'例外が発生します。 'params [:id]'で渡しているものを確認する必要があります。 –

+0

この場合、私は許可証IDを右に出していますか?だから私のオブジェクトのコレクションを反復するために入力する必要がありますか?どのようにエラーを処理するには? –

関連する問題