nil:NilClass 的未定义方法“cliq_requests”
undefined method `cliq_requests' for nil:NilClass
我一直收到这个烦人的错误,但我无法解决。我最近发布了一个关于同一主题的问题,但没有得到有效的帮助。
我希望用户请求加入群组。 Cliqs = 组。我所有的控制台测试似乎都是正确的,但我似乎无法找到解决问题的方法。该关联正在显示,但我似乎无法将 update/accept 方法获取到 运行。
这让我发疯!我该如何解决这个问题?
这是我的代码:
我的模特:
class User < ActiveRecord::Base
has_many :uploads
has_one :owned_cliq, foreign_key: 'owner_id', class_name: 'Cliq', dependent: :destroy
has_many :cliq_memberships, dependent: :destroy
has_many :cliqs, through: :cliq_memberships
has_many :cliq_requests, dependent: :destroy
...
end
class Cliq < ActiveRecord::Base
belongs_to :owner, class_name: 'User'
has_many :cliq_memberships, dependent: :destroy
has_many :members, through: :cliq_memberships, source: :user
has_many :cliq_requests, dependent: :destroy #cliq_request_sender
has_many :pending_members, through: :cliq_requests, source: :user, foreign_key: 'user_id'
end
class CliqRequest < ActiveRecord::Base
#from
belongs_to :user
#to
belongs_to :cliq
#validate :not_member
#validate :not_pending
def accept
cliq.members << pending_member
destroy
end
end
我的控制器:
class CliqRequestsController < ApplicationController
def index
#incoming
#@cliq_requests_received = CliqRequest.where(cliq: cliq)
#outgoing
#@cliq_requests_sent = current_user.cliq_requests
end
def show
end
def create
cliq = Cliq.find_by(params[:id])
@cliq_request = current_user.cliq_requests.new(cliq: cliq)
if @cliq_request.save
redirect_to current_user #change to cliqs/cliq path later
else
redirect_to cliq_path
end
end
def update
@cliq = Cliq.find_by(id: params[:cliq_id])
@cliq_request = @cliq.cliq_requests.find_by(id: params[:id])
@cliq_request.accept
end
def destroy
@cliq_request.destroy
end
end
我的看法:
<h1><%= @cliq.name %></h1>
<%= link_to 'Request to join Cliq', '/cliqs/:cliq_id/cliq_requests', :method => :post %>
<% @cliq_members.each do |cliq_member| %>
<ul><%= link_to cliq_member.username, user_path(cliq_member) %></ul>
<% end %>
<% if @current_user = @cliq.owner %>
<% @cliq.pending_members.each do |pending_member| %>
<ul><%= link_to pending_member.username, user_path %>
<%= link_to "Accept", "/cliqs/:cliq_id/cliq_requests/:id/", :method => :put %>
<%= link_to "Deny", "/cliqs/:cliq_id/cliq_requests/:id/", :method => :delete %>
</ul>
<% end %>
<% end %>
我的路线:
resources :cliqs do
resources :cliq_requests
end
这些行格式不正确:
<%= link_to 'Request to join Cliq', '/cliqs/:cliq_id/cliq_requests', :method => :post %>
<%= link_to "Accept", "/cliqs/:cliq_id/cliq_requests/:id/", :method => :put %>
<%= link_to "Deny", "/cliqs/:cliq_id/cliq_requests/:id/", :method => :delete %>
我建议您使用路径助手 [例如cliq_cliq_request_path(cliq, cliq_request)
如果您使用足智多谋的路由]。您可以使用 rake routes 寻求帮助。如果您在 development.log 或 test.log 中看到 :cliq_id
和 :id
之类的内容作为被命中的 URL 的一部分,则这些内容应该是数字。您也可以自己插入字符串(例如 "/cliqs/#{cliq_id}/cliq_requests/#{cliq_request.id}"
),但这通常需要更多的输入,而且随着时间的推移肯定会更加脆弱。
您的问题之一可能是您正在遍历待定成员名称列表,其中没有正确构成 link 所需的所有数据。所以您的更新操作可能工作正常,但您可能没有向它传递正确的数据。
还有这一行:
if @current_user = @cliq.owner
是一个赋值,因此总是 return 为真。大概你的意思是 ==
我一直收到这个烦人的错误,但我无法解决。我最近发布了一个关于同一主题的问题,但没有得到有效的帮助。
我希望用户请求加入群组。 Cliqs = 组。我所有的控制台测试似乎都是正确的,但我似乎无法找到解决问题的方法。该关联正在显示,但我似乎无法将 update/accept 方法获取到 运行。
这让我发疯!我该如何解决这个问题?
这是我的代码:
我的模特:
class User < ActiveRecord::Base
has_many :uploads
has_one :owned_cliq, foreign_key: 'owner_id', class_name: 'Cliq', dependent: :destroy
has_many :cliq_memberships, dependent: :destroy
has_many :cliqs, through: :cliq_memberships
has_many :cliq_requests, dependent: :destroy
...
end
class Cliq < ActiveRecord::Base
belongs_to :owner, class_name: 'User'
has_many :cliq_memberships, dependent: :destroy
has_many :members, through: :cliq_memberships, source: :user
has_many :cliq_requests, dependent: :destroy #cliq_request_sender
has_many :pending_members, through: :cliq_requests, source: :user, foreign_key: 'user_id'
end
class CliqRequest < ActiveRecord::Base
#from
belongs_to :user
#to
belongs_to :cliq
#validate :not_member
#validate :not_pending
def accept
cliq.members << pending_member
destroy
end
end
我的控制器:
class CliqRequestsController < ApplicationController
def index
#incoming
#@cliq_requests_received = CliqRequest.where(cliq: cliq)
#outgoing
#@cliq_requests_sent = current_user.cliq_requests
end
def show
end
def create
cliq = Cliq.find_by(params[:id])
@cliq_request = current_user.cliq_requests.new(cliq: cliq)
if @cliq_request.save
redirect_to current_user #change to cliqs/cliq path later
else
redirect_to cliq_path
end
end
def update
@cliq = Cliq.find_by(id: params[:cliq_id])
@cliq_request = @cliq.cliq_requests.find_by(id: params[:id])
@cliq_request.accept
end
def destroy
@cliq_request.destroy
end
end
我的看法:
<h1><%= @cliq.name %></h1>
<%= link_to 'Request to join Cliq', '/cliqs/:cliq_id/cliq_requests', :method => :post %>
<% @cliq_members.each do |cliq_member| %>
<ul><%= link_to cliq_member.username, user_path(cliq_member) %></ul>
<% end %>
<% if @current_user = @cliq.owner %>
<% @cliq.pending_members.each do |pending_member| %>
<ul><%= link_to pending_member.username, user_path %>
<%= link_to "Accept", "/cliqs/:cliq_id/cliq_requests/:id/", :method => :put %>
<%= link_to "Deny", "/cliqs/:cliq_id/cliq_requests/:id/", :method => :delete %>
</ul>
<% end %>
<% end %>
我的路线:
resources :cliqs do
resources :cliq_requests
end
这些行格式不正确:
<%= link_to 'Request to join Cliq', '/cliqs/:cliq_id/cliq_requests', :method => :post %>
<%= link_to "Accept", "/cliqs/:cliq_id/cliq_requests/:id/", :method => :put %>
<%= link_to "Deny", "/cliqs/:cliq_id/cliq_requests/:id/", :method => :delete %>
我建议您使用路径助手 [例如cliq_cliq_request_path(cliq, cliq_request)
如果您使用足智多谋的路由]。您可以使用 rake routes 寻求帮助。如果您在 development.log 或 test.log 中看到 :cliq_id
和 :id
之类的内容作为被命中的 URL 的一部分,则这些内容应该是数字。您也可以自己插入字符串(例如 "/cliqs/#{cliq_id}/cliq_requests/#{cliq_request.id}"
),但这通常需要更多的输入,而且随着时间的推移肯定会更加脆弱。
您的问题之一可能是您正在遍历待定成员名称列表,其中没有正确构成 link 所需的所有数据。所以您的更新操作可能工作正常,但您可能没有向它传递正确的数据。
还有这一行:
if @current_user = @cliq.owner
是一个赋值,因此总是 return 为真。大概你的意思是 ==