Ruby on rails 如何修复“未定义的方法`user'(ActiveRecord\u Associations\u CollectionProxy)
我有一个用户问答模型,我的目标是让它像堆栈溢出一样工作。我遇到了允许用户只编辑或删除他们对问题的答案的问题。 我正在使用一个助手,它在问题旁边显示了一个要编辑的链接:Ruby on rails 如何修复“未定义的方法`user'(ActiveRecord\u Associations\u CollectionProxy),ruby-on-rails,ruby,activerecord,collections,associations,Ruby On Rails,Ruby,Activerecord,Collections,Associations,我有一个用户问答模型,我的目标是让它像堆栈溢出一样工作。我遇到了允许用户只编辑或删除他们对问题的答案的问题。 我正在使用一个助手,它在问题旁边显示了一个要编辑的链接: module AnswersHelper def own_answers_partial_path @question = Question.find(params[:id]) if @question.answers.user == current_user 'answers/own_answer
module AnswersHelper
def own_answers_partial_path
@question = Question.find(params[:id])
if @question.answers.user == current_user
'answers/own_answer'
else
'answers/other_answer'
end
end
end
但是,这会导致未定义的方法错误:
'user' for #<Answer::ActiveRecord_Associations_CollectionProxy:0x00000000133d54d8>
但是它们不起作用,我不知道在这种情况下如何使用循环,我在视图中使用循环来获取信息
有没有办法用这种方法解决这个问题?或者,我是否需要采取另一种方法来允许用户编辑他们自己的答案
应答控制器
类应答器控制器<应用程序控制器
在\u操作之前:设置\u答案,仅:[:显示,:编辑,:更新,:销毁]
def索引
@question=question.findparams[:id]
@答案=@question.answers.all
终止
def秀
终止
def新
@question=question.findparams[:id]
@答案=@question.answer.new
终止
定义编辑
终止
def创建
@question=question.findparams[:id]
@答案=@question.answers.buildanswer\u参数
回应待办事项|格式|
if@answer.save
format.html{将_重定向到@answer.question,注意:'答案已成功创建。}
format.json{render:show,status::created,location:@answer.question}
其他的
format.html{render:new}
format.json{render json:@answer.errors,status::unprocessable_entity}
终止
终止
终止
def更新
回应待办事项|格式|
if@answer.updateanswer\u参数
format.html{将_重定向到@answer.question,注意:'答案已成功更新。}
format.json{render:show,status::ok,location:@answer.question}
其他的
format.html{render:edit}
format.json{render json:@answer.errors,status::unprocessable_entity}
终止
终止
终止
def销毁
@answer=当前用户.answers.findparams[:id]
@答案:毁灭
回应待办事项|格式|
format.html{重定向到答案url,注意:'答案已成功销毁。}
format.json{head:no_content}
终止
终止
私有的
使用回调在操作之间共享公共设置或约束。
def set_答案
@answer=answer.findparams[:id]
终止
永远不要相信来自恐怖网络的参数,只允许白名单通过。
def应答参数
参数require:answer.permit:body.mergeuser:current_用户,问题:@question
终止
终止
主要问答观点
<% if answer.user == current_user %>
<%= link_to 'edit', edit_answer_path(answer) %>
<% end %>
哪些链接指向答案视图
<% if answer.user == current_user %>
<%= link_to 'edit', edit_answer_path(answer) %>
<% end %>
而不是在答案视图中,因为您没有将局部变量传递给视图和其他辅助对象,所以答案视图不起作用,我只想向答案视图添加一个简单的条件,就像这样
<% if answer.user == current_user %>
<%= link_to 'edit', edit_answer_path(answer) %>
<% end %>
我绝对不是专家,但我认为您也应该阻止用户通过控制器编辑其他用户的答案。在当前解决方案中,恶意用户可能会浏览到/answers/ID并绕过您隐藏的编辑链接 //编辑: 例如,在您的应答器中,控制器顶部包括:
before_action :answer_owner, only: [:edit, :update, :destroy]
然后在控制器底部包含以下内容,作为专用功能:
def answer_owner
unless @answer.user_id == current_user.id
flash[:notice] = 'Access denied since you are not the owner of this Answer'
redirect_to answers_path
end
end
调用if@question.answers.user==current_user,您希望实现什么?根据方法名称,我猜您只希望加载当前_用户已回答的问题-正确吗?以后如何使用该方法?基本上我想说:如果问题上的答案来自当前_用户,则呈现部分。如果答案?答案是一个数组。你的意思是,如果任何答案来自当前用户?还是所有答案?如果一个答案来自当前用户,而另一个答案不是,会发生什么情况?抱歉,如果任何答案来自当前用户,请显示一个额外链接,允许他们编辑或删除答案。如果答案不是来自cuRrTunl用户,不要在答案旁边显示一个链接。你认为在你的视图中有一个简单的if回答。用户==Currutux用户块吗?它解决了!我整天都在疯狂地检查我的路线、关联、模型、控制器和视图,试图找出问题的所在。当解决方案如此简单和省时时,总是令人沮丧。ant盯着我的脸看我不知道你在这里是什么意思。你的意思是我应该在控制器的编辑操作中添加一个条件语句吗?啊,我明白你的意思,这是一个很好的提示。谢谢!我还将在代码的其他区域实现这种方法
def answer_owner
unless @answer.user_id == current_user.id
flash[:notice] = 'Access denied since you are not the owner of this Answer'
redirect_to answers_path
end
end