如何修复“未定义方法'用户'(ActiveRecord_Associations_CollectionProxy)

问题描述 投票:0回答:1

我有一个用户,问答模型,我的目标是像Stack Overflow这样的工作。我遇到了一些问题,使用户只能编辑或删除他们对问题的答案。我正在使用一个助手,它在问题旁边显示了一个编辑链接:

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>

我知道@question.answers.user是一个数组,所以@question.answers.user == current_user将不起作用。

我尝试使用:

.collect{ |answer| answer.user }
.map{ |answer| answer.user }
.each{ |answer| answer.user }

在阵列上。但是,它们不起作用,在这种情况下,我看不到如何使用循环(我在视图中使用循环来获取信息)。

是否有使用此方法修复它的方法?或者,我是否需要采取另一种方法来允许用户编辑自己的答案?

答案控制器

class AnswersController < ApplicationController
  before_action :set_answer, only: [:show, :edit, :update, :destroy]

  def index
    @question = Question.find(params[:id])
    @answers = @question.answers.all
  end

  def show
  end

  def new
    @question = Question.find(params[:id])
    @answer = @question.answer.new
  end

  def edit
  end

  def create
    @question = Question.find(params[:id])
    @answer = @question.answers.build(answer_params)

    respond_to do |format|
      if @answer.save
        format.html { redirect_to @answer.question, notice: 'Answer was successfully created.' }
        format.json { render :show, status: :created, location: @answer.question }
      else
        format.html { render :new }
        format.json { render json: @answer.errors, status: :unprocessable_entity }
      end
    end
  end

  def update
    respond_to do |format|
      if @answer.update(answer_params)
        format.html { redirect_to @answer.question, notice: 'Answer was successfully updated.' }
        format.json { render :show, status: :ok, location: @answer.question }
      else
        format.html { render :edit }
        format.json { render json: @answer.errors, status: :unprocessable_entity }
      end
    end
  end

  def destroy
    @answer = current_user.answers.find(params[:id])
    @answer.destroy
    respond_to do |format|
      format.html { redirect_to answers_url, notice: 'Answer was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_answer
      @answer = Answer.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def answer_params
      params.require(:answer).permit(:body).merge(user: current_user, question: @question)
    end

end

主要问答视图

<%= @question.title %>
Asked by <%= link_to @question.user.email, @question.user %></br>
<%= @question.body %>
</br>
<%= @question.answers.count %> Answers
<%= render @question.answers.order(created_at: :desc) %> 

哪个链接指向答案视图

<%= answer.body %></br>
<%= link_to answer.user.first_name, answer.user %> answered <%= time_ago_in_words(answer.created_at) %> ago.
</br>
<%= render own_answers_partial_path %>
ruby-on-rails ruby activerecord collections associations
1个回答
0
投票

代替答案视图中的<%= render own_answers_partial_path %>(这不起作用,因为您没有将局部变量传递给视图),并且我只是将一个简单的条件添加到答案视图中,这是附加的帮助器,>

<% if answer.user == current_user %>
  <%= link_to 'edit', edit_answer_path(answer) %>
<% end %>
© www.soinside.com 2019 - 2024. All rights reserved.