Rails Association,未定义的方法

时间:2016-09-21 15:47:22

标签: ruby-on-rails associations

我正在研究两个简单的模型

class Permit < ApplicationRecord
   belongs_to :user, optional: true
   validates :user_id, presence: true
end

class User < ApplicationRecord
  has_many :permits
  has_secure_password
end

在轨道控制台中,我正在执行以下操作

user = User.find(10)

将User对象分配给用户。 但是,当我想为用户创建许可时,它会出现此错误

NoMethodError in PermitsController#create
undefined method `Permit' for #<User:0xaaa3528>

如何解决这个问题?谢谢!

这是我的permit_controller,我认为问题出在CREATE操作

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 = user.permits.create(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

许可证/新/ 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:&#34;车牌&#34; %GT;         &lt;%= f.text_field:carplate,class:&#39; form-control&#39; %GT;

    <%= 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 %>

3 个答案:

答案 0 :(得分:0)

您必须按如下方式创建许可证:

user.permits.create(..)

答案 1 :(得分:0)

你设置before_action :set_permit, only: [:show, :destroy],这意味着你只能在这两种方法中使用@permits(应该是单数),我看到你在更新中使用@permits。没看到你允许user_id为permit_params。

在创建@permits = user.permits.create(permit_params)时,您没有声明用户。 您设置before_action :set_permit, only: [:show, :destroy],为什么不@permits.destroy

belongs_to :user, optional: true
validates :user_id, presence: true

optional:true但user_id with presence:true,是不是冲突?你怎么需要一个可选的?

你有更多的错误要处理谢谢你。

祝你好运

答案 2 :(得分:0)

我不是铁路专家,但我会尝试帮助解决这个问题并尝试解决可能存在的错误。

  1. 在您的架构中,请确保在Permits表中有一个user_id列。

  2. 测试该关联在rails控制台中是否有效。 user = User.first user.permits 如果它有效,那就意味着你的协会正在发挥作用。

  3. 首先测试你的许可证创建功能,而不包括&#34;用户&#34;在里面。只有在您的许可证完全正常运行后才能添加用户方面!

  4. 希望它有所帮助!干杯