首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将数据从模型呈现到另一个控制器

将数据从模型呈现到另一个控制器
EN

Stack Overflow用户
提问于 2016-10-12 05:48:03
回答 1查看 39关注 0票数 0

我对ROR还不熟悉。我正在实施一个网站,创建一个许可证,然后,然后将用户重定向到发票页面。我有一个用户模型,发票模式和许可模式,他们之间有关联如下:

invoice.rb

代码语言:javascript
复制
class Invoice < ApplicationRecord
  belongs_to :user
  has_one :receipt
  belongs_to :permit
end

user.rb

代码语言:javascript
复制
class User < ApplicationRecord
  has_many :permits
  has_many :visitor_permits
  has_many :healthreports
  has_secure_password
end

permit.rb

代码语言:javascript
复制
class Permit < ApplicationRecord
  belongs_to :user
  has_one :invoice
end

我要做的是,用户在申请许可证时填写所有细节,这些信息将保存到许可证模型中。在此之后,用户将被重定向到发票页面,将用户刚刚填写的所有数据呈现在许可证申请页面中,并从许可证模型中提取数据并显示在发票页面上,然后再保存到发票页面中。我不知道该怎么开始。知道怎么做吗?

我有许可证和发票管理员。如果你们需要更多的信息或者我的代码,请告诉我。谢谢!

我尝试的是在发票控制器中创建一个与许可证模型链接的变量,这样我就可以使用它来呈现来自许可模型的数据,然后将它保存到发票模型中。

代码语言:javascript
复制
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

但我一直搞错了

代码语言:javascript
复制
ActiveRecord::RecordNotFound in InvoiceController#new
Couldn't find Permit with 'id'=

指向新的行动。

代码语言:javascript
复制
@permits = Permit.find(params[:id])

这是我的permits_controller.rb,一旦按下按钮,它将在创建操作中重定向用户。

代码语言:javascript
复制
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

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-12 06:12:50

我看到您的createinvoice路由没有设置来接受任何额外的参数。默认路由应该生成类似于invoice/new的内容。因此,当在path中发送@permit id时,您需要如下所示:

代码语言:javascript
复制
redirect_to createinvoice_path(permit_id: @permits.id)

invoice_controller中获取params[:permit_id]

编辑:我不擅长解释,但我会尽力的。您的发票路径是get createinvoice,所以当有人访问yourdomain.com/createinvoice时,它将使用该页面。请注意,路由get createinvoice不包含任何params的占位符,在rails默认生成的显示页面中可以看到如get users/:id。如果路由设置是这样的,那么当我们编写redirect_to users_path(@user)时,rails将使用id of @user并在url中替换它,当页面呈现用户id为3并且在控制器中您可以通过params[:id]访问该id时,它将变成users/3。但是,在您的示例中,路由不是接受任何params的设置,因此rails只是忽略了createinvoice_path中的createinvoice_path,并且由于params中不存在id,所以会出现错误。我建议的是createinvoice_path(permit_id: @permits.id),如果许可证的id为3,它将把url作为createinvoice/?permit_id=3,所以这会像你在google搜索时看到的那样,将params作为一个查询参数发送。你会得到permit_idparams

希望你明白我的意思。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39991311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档