我有一个用户,问答模型,我的目标是像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 %>
代替答案视图中的<%= render own_answers_partial_path %>
(这不起作用,因为您没有将局部变量传递给视图),并且我只是将一个简单的条件添加到答案视图中,这是附加的帮助器,>
<% if answer.user == current_user %>
<%= link_to 'edit', edit_answer_path(answer) %>
<% end %>