2016-10-12 3 views
0

Я новичок в ROR. Я реализую веб-сайт, который создает разрешение, после чего перенаправляет пользователя на страницу счета-фактуры. У меня есть модель пользователя, модель счета и разрешение модели, которые они имеют связь друг с другом ниже:Предоставление данных от модели другому контроллеру

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 

Что я буду делать, так это то, что пользователь заполняет все детали при подаче заявок на получение разрешений и информации будет сохраняться в модели разрешений. После этого пользователь будет перенаправлен на страницу счетов-фактур, которые будут отображать все данные, которые только что были заполнены пользователем на странице приложения-разрешения, и извлечь их из модели разрешения и отобразить на странице счета-фактуры, которая после этого будет снова сохранена на странице счета-фактуры. Я не знаю, как это начать. Любая идея о том, как это сделать?

У меня есть разрешение и счет-контроллер. Если вам, ребята, нужна дополнительная информация, или мой код не стесняется рассказывать мне. Благодаря!

То, что я пробовал, создает переменную, связанную с моделью разрешений, в моем новом контроллере счетов-фактур NEW, поэтому я могу использовать его для рендеринга данных из модели Permit, а затем сохранить его в модели счета-фактуры.

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 

Но я получаю ошибку

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

, которые указывают на новое действие.

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

Это мой permits_controller.rb, который будет перенаправлять пользователя в СОЗДАТЬ действие после того, как нажата кнопка

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

Можете ли вы разместить «маршруты» для выставления счета? – Sajan

+0

Я обновил свой вопрос :) –

ответ

1

Я вижу, что ваш createinvoice маршрут не чтобы принять любой дополнительный параметр. по умолчанию маршрут должен был сгенерировать что-то вроде invoice/new. Так при отправке @permit идентификатора в пути вам нужно что-то вроде:

redirect_to createinvoice_path(permit_id: @permits.id) 

и invoice_controller выборка params[:permit_id]

EDIT: Я не очень хорошо объяснить, но я попробую. Ваш маршрут маршрута для счета-фактуры get createinvoice поэтому, когда кто-то посещает yourdomain.com/createinvoice, он перейдет на эту страницу. Обратите внимание, что ваш маршрут get createinvoice не содержит каких-либо параметров для любых параметров, что-то, что вы видите в rails по умолчанию, показываете страницу, такую ​​как get users/:id. Если настройка маршрута такова, что тогда, когда мы пишем redirect_to users_path(@user), рельсы возьмут id из @user и заменит его на url, и он станет как users/3, когда страница будет отображаться, если пользовательский идентификатор равен 3, а в контроллере вы можете получить доступ к этому идентификатору на params[:id].Но в вашем случае маршрут не настроен на принятие каких-либо параметров, поэтому рельсы просто игнорируют @permits внутри createinvoice_path, и вы получаете ошибку, так как нет id присутствует в params. Я предложил createinvoice_path(permit_id: @permits.id), который сделает URL как createinvoice/?permit_id=3, если идентификатор разрешений - 3. Таким образом, это отправит параметры как параметры запроса, которые вы видите во время поиска в google. И вы получите permit_id в params.

Надеюсь, вы поняли мою точку зрения.

+0

Спасибо! Это решило мою проблему, но я до сих пор не совсем понимаю, как это решение работает. Не могли бы вы подробно объяснить мне? –