无法检测多对多关系中的错误

Unable to detect error in many to many relationship

我有一个错误,这让我发疯了几天....我通过 table [=32] 在用户(由设计创建)和公园之间建立了多对多关系=].当我想为某个用户创建一个新公园时,我收到错误消息:"undefined method `user=' for # Did you mean? users= users"。不幸的是,我无法在我的代码中找到阻止我创建用户和公园之间关系的错误。

架构

create_table "parks", force: :cascade do |t|
    t.text "name"
end

create_table "user_parks", force: :cascade do |t|
    t.bigint "park_id"
    t.bigint "user_id"
    t.index ["park_id"], name: "index_user_parks_on_park_id"
    t.index ["user_id"], name: "index_user_parks_on_user_id"
end

create_table "users", force: :cascade do |t|
    t.string "email", default: "", null: false
    t.integer "role"
end

  add_foreign_key "user_parks", "parks"
  add_foreign_key "user_parks", "users"
end

型号

class Park < ApplicationRecord
  has_many :user_parks
  has_many :users, :through => :user_parks
end

class UserPark < ApplicationRecord
  belongs_to :park
  belongs_to :user
end

class User < ApplicationRecord
  has_many :user_parks
  has_many :parks, :through =>  :user_parks
  enum role: [:owner, :admin, :employee, :accountant]

  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
end

公园政策

class ParkPolicy < ApplicationPolicy
  class Scope < Scope
    def resolve
     if user.admin?
        scope.where(user: user)
      end
    end
  end

  def index?
    user.admin?
  end

  def new?
    user.admin?
  end

  def create?
    user.admin?
  end
end

parks_controller

class ParksController < ApplicationController
  skip_before_action :authenticate_user!

  #create a new park
  def new
    @park = Park.new
    authorize @park
  end

  def create
    @user = current_user
    @park = Park.new(park_params)
    authorize @park
    @park.user = @user
    @park.save
    redirect_to parks_path
  end

  #edit park
  def edit
    @park = Park.find(params[:id])
  end

  def update
    @park = Park.find(params[:id])
    @park = Park.update(park_params)
    redirect_to parks_path
  end

  def index
    @user = current_user
    @parks = policy_scope(Park)
  end

private
  def park_params
    params.require(:park).permit(:name)
  end
end

new.html.erb(公园)

<%= simple_form_for ([@user, @park]) do |f|%>
  <%= f.input :name %>
  <%= f.submit "Add park", class: "btn btn-primary" %>
<% end %>

当我想为某个用户创建一个新公园时,我收到错误消息:"undefined method `user=' for # Did you mean? users= users"。

这是多对多关系。 Park 没有一个用户,它有一组用户。

# parks_controller.rb

def create
  @user = current_user
  @park = Park.new(park_params)
  authorize @park
  @park.users << @user # here
  @park.save
  redirect_to parks_path
end

你有很多联想。而不是 @user.park 你需要使用 @user.parks

最简单的方法是在初始化表单之前初始化 park 对象

parks_controller

def new
  @park = current_user.parks.build
  authorize @park
end

def create
  @park = current_user.parks.create(park_params)
  redirect_to parks_path
end

new.html.erb(公园)

<%= simple_form_for(@park) do |f|%>
  <%= f.input :name %>
  <%= f.submit "Add park", class: "btn btn-primary" %>
<% end %>

您可以在此处检查可用于具有许多关联的对象的方法:docs