无法检测多对多关系中的错误
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
我有一个错误,这让我发疯了几天....我通过 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