2016-09-21 2 views
-1

Я делаю сайт разрешения на парковку. Проблема, с которой я столкнулся, заключается в том, что я не могу сохранить свои данные в базе данных PERMIT, связанной с базой данных USER. Проблема, я думаю, я не привел пользователя к разрешению (возможно, я что-то пропустил). Я обнаружил ошибку при попытке сохранить из Permit.errors.full_messages [Пользователь должен существовать]. Любая помощь приветствуется, спасибо!Рельсы Не удалось сохранить данные, ассоциация

schema.rb

ActiveRecord::Schema.define(version: 20160920143651) do 

    create_table "permits", force: :cascade do |t| 
    t.string "vehicle_type" 
    t.string "name" 
    t.string "studentid" 
    t.string "department" 
    t.string "carplate" 
    t.string "duration" 
    t.date  "permitstart" 
    t.date  "permitend" 
    t.integer "user_id" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    t.index ["user_id"], name: "index_permits_on_user_id" 
    end 

    create_table "users", force: :cascade do |t| 
    t.string "name" 
    t.string "email" 
    t.datetime "created_at",  null: false 
    t.datetime "updated_at",  null: false 
    t.string "password_digest" 
    t.integer "user_type" 
    end 

end 

Create_permit.rb

class CreatePermits < ActiveRecord::Migration[5.0] 
    def change 
    create_table :permits do |t| 
     t.string :vehicle_type 
     t.string :name 
     t.string :studentid 
     t.string :department 
     t.string :carplate 
     t.string :duration 
     t.date :permitstart 
     t.date :permitend 
     t.references :user, foreign_key: true 

     t.timestamps 
    end 
    add_index :permits, :user_id 
    end 
end 

Permit_controller

class PermitsController < ApplicationController 
    before_action :set_permit, only: [:show, :destroy] 
    def index 
    @permits = Permit.all 
    end 

    def new 
    @permits = Permit.new 
    end 

    def create 
    @permits = Permit.new(permit_params) 

     if @permits.save 
     redirect_to @permits 
     else 
     redirect_to contact_path 
     end 

    end 

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

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

    def update 
    respond_to do |format| 
     if @permits.update(user_params) 
     format.html { redirect_to @user, notice: 'Permit was 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 

    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 

user.rb

class User < ApplicationRecord 
    has_many :permits 
    has_secure_password 
end 

Permit.rb

class Permit < ApplicationRecord 
    belongs_to :user 
    end 

permit/new.html.erb 
<% provide(:title, 'New Permit') %> 
<h1>Permit Application</h1> 

<div class="row"> 
    <div class="col-md-6 col-md-offset-3"> 
    <%= form_for(@permits) do |f| %> 

     <%= f.label :"Vehicle" %> 
     <%= f.text_field :vehicle_type, class: 'form-control' %> 

     <%= f.label :"License Plate" %> 
     <%= f.text_field :carplate, class: 'form-control' %> 

     <%= f.label :"Student ID" %> 
     <%= f.text_field :studentid, class: 'form-control' %> 

     <%= f.label :name %> 
     <%= f.text_field :name, class: 'form-control' %> 

     <%= f.label :"Department of applicant" %> 
     <%= f.text_field :department, class: 'form-control' %> 

     <%= f.label :permit_start %> 
     <%= f.date_select :permitstart, class: 'form-control' %> 

     <%= f.label :permit_end %> 
     <%= f.date_select :permitend, class: 'form-control' %> 


     <%= f.submit "Submit", class: "btn btn-primary" %> 
    <% end %> 
    </div> 
</div> 

ответ

0

Где именно ваша ошибка? Если в действии update, вы должны изменить свой before_action. Вы должны добавить туда :update действие.

before_action :set_permit, only: [:show, :destroy, :update] 
+0

Я пытаюсь создать новое разрешение, поэтому проблема, вероятно, связана с действием CREATE. –

+0

Вы все равно должны это делать, уважая текущую проблему, можете ли вы добавить дополнительную информацию об ошибке? –

+0

Он не показывает мне стрелку, только данные разрешения не могут быть сохранены в базе данных из-за того, что пользователь не объявлен. Который пользователь должен объявить, поскольку у них есть отношения. –

1

Я предполагаю, что вы используете Rails 5. Проблема у вас есть belongs_to ассоциации по permit что принадлежит user, но при создании permit вы не связывая любой пользователя с ним и в Rails 5 является обязательной присвоить данные ассоциации belongs_to, то есть вы не можете сохранить permit, если у нее нет user_id, поэтому попробуйте назначить user_id на номер permit. refer this for change to rails 5 belongs_to association

+0

Это решило мою текущую проблему. Разрешение, сохраненное, но сохраненное под каждым пользователем, заставило каждого пользователя получить к нему доступ. В контроллере разрешения создайте действие, я попытался изменить эту строку на @permits = Permit.new (allow_params) на @permit = current_user.Permit (allow_parasm). Эта ошибка показала: «NoMethodError в PermitsController # create undefined method' Permit 'для # " –

+0

' @permit = current_user.Permit (permit_params) 'не является правильным синтаксисом. вам может понадобиться что-то вроде: '@permit = Permit.new (allow_params)', а затем назначить пользователя как '@permit.user = current_user' или вы можете добавить ассоциацию 'has_one: allow' в' user' model и в 'allow controller' use '@permit = current_user.build_permit (allow_params)' – Sajan

+0

@GaryVlc, если мой ответ решает вашу проблему, то не могли бы вы принять его в качестве ответа? – Sajan