2016-10-12 2 views
0

Ich bin neu in ROR. Ich implementiere eine Website, die eine Genehmigung erstellt und anschließend den Benutzer auf eine Rechnungsseite umleitet. Ich habe ein Benutzermodell, Rechnung Modell und Genehmigung Modell, das sie Verbindung miteinander haben unter:Rendern von Daten von einem Modell zu einem anderen Controller

invoice.rb

class Invoice < ApplicationRecord 
    belongs_to :user 
    has_one :receipt 
    belongs_to :permit 
end 

user.rb

class User < ApplicationRecord 
    has_many :permits 
    has_many :visitor_permits 
    has_many :healthreports 
    has_secure_password 
end 

permit.rb

class Permit < ApplicationRecord 
    belongs_to :user 
    has_one :invoice 
end 

Was ich tun werde, ist der Benutzer füllen Sie alle Details, wenn sie für Genehmigungen und die Informa beantragen wird in das Genehmigungsmodell gespeichert. Danach wird der Benutzer zur Rechnerseite umgeleitet, die alle Daten, die gerade von dem Benutzer auf der Genehmigungsanwendungsseite gefüllt wurden, aus dem Genehmigungsmodell herauszieht und auf der Rechnungsseite anzeigt, die danach wieder auf der Rechnungsseite gespeichert wird. Ich habe keine Ahnung, wie ich es anfangen soll. Irgendeine Idee, wie es geht?

Ich habe Genehmigung und Rechnung Controller. Wenn ihr noch mehr Informationen oder meinen Code braucht, könnt ihr mir das gerne sagen. Vielen Dank!

Was ich versucht habe, ist eine Variable mit dem Genehmigungsmodell in meiner Rechnung Controller NEW Aktion erstellen, damit ich es verwenden kann, um die Daten von Permit-Modell zu rendern und dann in Rechnungsmodell zu speichern.

class InvoiceController < ApplicationController 
    def new 
    @permits = Permit.find(params[:id]) 
    @invoice = Invoice.new 
    end 

    def create 
    #@current_user = User.find_by(id: session[:user_id]) 
    @invoice = current_user.visitor_permits.invoices.build(invoice_params) 
    if @invoice.save 

    else 

    end 
    end 

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

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

Aber ich halte den Fehler immer

ActiveRecord::RecordNotFound in InvoiceController#new 
Couldn't find Permit with 'id'= 

, die auf die neue Aktion.

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

Das ist mein permits_controller.rb, welcher Benutzer in der Aktion erstellen, sobald die Taste gedrückt

class PermitsController < ApplicationController 
    before_action :set_permit, only: [: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 createinvoice_path(@permits) 

    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.find(params[: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 

Route.db

Rails.application.routes.draw do 
    resources :users 
    resources :permits do 
    collection do 
     post :confirm 
    end 
    end 
    resources :visitor_permits do 
    collection do 
     post :confirm 
    end 
    end 
    resources :invoice 
    resources :receipt 
    resources :health_report 

    root 'static_pages#home' 


    get 'permitapplication' => 'permits#new' 
    get 'viewpermit' =>'permits#show' 
    get 'show_permit' =>'permits#index' 
    get 'invoice' => 'permits#invoice' 
    post 'createpermit' => 'permits#create' 
    post 'permits' => 'permits#create' 

    post 'createvpermit' => 'visitor_permits#create' 
    post 'vpermits' => 'visitor_permits#create' 
    get 'show_vpermit' =>'visitor_permits#index' 
    get 'show_visitor_permit' =>'visitor_permits#show' 
    get 'visitorpermit' => 'visitor_permits#new' 

    get 'createinvoice' => 'invoice#new' 
    post 'invoice' => 'invoice#create' 

    get 'new_health_report' => 'health_report#new' 

    get 'payment' =>'transaction#new' 

    get 'homepage/index' 

    get 'adminlogin' => 'admin_controller#index' 

    get 'patrollogin' => 'patrol_officer#index' 

    post 'citations' => 'citations#create' 
    get 'new_citation' => 'citations#new' 
    get 'unpaid_citations' => 'citations#list_all' 
    get 'edit_Citation' => 'citations#edit' 

    get 'contact'=> 'static_pages#contact' 
    get 'about' => 'static_pages#about' 
    get 'help' => 'static_pages#help' 

    get 'signup' => 'users#new' 
    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 
+0

Können Sie die "Routen" für die Rechnung buchen? – Sajan

+0

Ich habe meine Frage aktualisiert :) –

Antwort

1

Ich sehe, dass Ihr createinvoice Route nicht umleitet ist Setup, um zusätzliche Parameter zu akzeptieren. Standardroute sollte etwas wie invoice/new erzeugt haben. Während also @permit id in Pfad zu senden müssen Sie so etwas wie:

redirect_to createinvoice_path(permit_id: @permits.id) 

und in invoice_controllerparams[:permit_id]

EDIT holen: Ich bin nicht gut im Erklären, aber ich werde es versuchen. Ihr Routenpfad für die Rechnung ist get createinvoice, also wenn jemand yourdomain.com/createinvoice besucht, wird es auf diese Seite gehen. Beachten Sie, dass Ihre Route get createinvoice keinen Platzhalter für Params enthält, etwas, das Sie in Rails standardmäßig generierte Show-Seite wie get users/:id sehen. Wenn das Routen-Setup so ist, dann werden die Schienen redirect_to users_path(@user) nehmen, id von @user und es in url ersetzen und es wird wie users/3 wenn Seite rendert, wenn Benutzer-ID 3 ist und in Controller können Sie auf diese ID von params[:id] zugreifen.Aber in Ihrem Fall Route ist nicht eingerichtet, um irgendwelche Parameter zu akzeptieren, so Schienen ignoriert einfach die @permits innerhalb der createinvoice_path und Sie erhalten Fehler, da keine id in params vorhanden ist. Was ich vorgeschlagen habe, ist createinvoice_path(permit_id: @permits.id), die die URL als createinvoice/?permit_id=3 machen wird, wenn die ID der Genehmigungen 3 ist. So wird dies die Params als Abfrage params wie Sie sehen, während Sie in Google suchen. Und Sie werden die in params bekommen.

Hoffe, du hast meinen Punkt.

+0

Danke! Es löste mein Problem, aber ich weiß immer noch nicht genau, wie diese Lösung funktioniert. Würde es Ihnen etwas ausmachen, mir das im Detail zu erklären? –

Verwandte Themen