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