我正在尝试实施Best In Place gem并跟随Railscast,但我遇到了问题。我正在学习Rails并正在使用两个模型Article
和Comment
构建一个示例博客应用。我试图使用Best In Place编辑评论。
_list_comments.html.erb
<% @comments.each do |comment| %>
<hr />
<%= link_to article_comment_path(@article, comment), method: :delete, data: {confirm: 'Are you sure?'}, remote: true do %>
<span class="glyphicon glyphicon-remove"></span>
<% end %>
<%= content_tag :span, '', id: "#{comment.id}", class: "glyphicon glyphicon-edit edit_comment" %>
<!--<%= content_tag :p, content_tag(:small, "#{comment.author}"), id: "comment_author_#{comment.id}" %>-->
<%= best_in_place comment, :author %>
<%= content_tag :p, id: "comment_body_#{comment.id}" do %>
<%= comment.body %>
<% end %>
<% end %>
它给了我这个错误:ActionView::Template::Error (undefined method comment_path for #<#<Class:0x007fdc38fb8288>:0x007fdc38fc36b0>):
,指的是<%= best_in_place comment, :author %>
。我很确定我正确安装了所有内容,所以我不知道问题所在。
当我将<%= best_in_place comment, :author %>
更改为<%= best_in_place "#{comment}", :author %>
时,它会出现此错误:undefined method 'author' for "#<Comment:0x007fdc3c841820>":String
。
comments_controller.html.erb
class CommentsController < ApplicationController
def create
@comment = Comment.new(comment_params)
@comment.article_id = params[:article_id]
if @comment.save
respond_to do |f|
f.html { redirect_to article_path(params[:article_id]), notice: 'Comment created!' }
f.js {
@article = Article.find(params[:article_id])
@comment = @comment
@comments = Comment.where(article_id: params[:article_id])
}
end
else
redirect_to article_path(params[:article_id]), warning: 'Unable to create comment.'
end
end
def destroy
@comment = Comment.find(params[:id]).destroy
respond_to do |f|
f.html { redirect_to article_path(params[:article_id]) }
f.js {
@article = Article.find(params[:article_id])
@comments = Comment.where(article_id: params[:article_id])
}
end
end
def update
@comment = Comment.find(params[:id])
if @comment.update(comment_params)
respond_to do |f|
f.html { redirect_to article_path(@comment.article_id) }
f.json { render head :ok}
end
else
respond_to do |f|
f.html { redirect_to article_path(@comment.article_id) }
f.json { render json: @comment.errors.full_messages, status: :unprocessable_entity }
end
end
end
private
def comment_params
params.require(:comment).permit(:author, :body)
end
end
答案 0 :(得分:4)
我能够克隆你的项目并找出你收到此错误的原因:
undefined method comment_path for #<#<Class:0x007fdc38fb8288>:0x007fdc38fc36b0>
以下是发生的事情。在此代码<%= best_in_place comment, :author %>
中,您正在传递comment
个对象。 best_in_place
试图通过附加注释路径(提示:未定义的方法comment_path
)将其映射到名为comment_path
的路由助手。
您的路线设置方式如下:
resources :articles do
resources :comments
end
如果你选择路线,你会注意到你没有一个名为comment_path
的辅助路径,它对应于你的comments#show
。它正在寻找comment_path
,它无法找到它。因此,错误消息。
但是,由于您使用的是嵌套资源,因此与comments#show
对应的辅助路径称为article_comment_path
。这是完整的映射:
article_comment_path GET /articles/:article_id/comments/:id(.:format) comments#show
要将best_in_place
映射到正确的帮助程序路径,有两种方法可以解决此问题:
1)只需将此路线添加到comment_path
文件,即可创建映射到routes.rb
的路线:
resources :comments, only: [:show]
上述路线的完整映射是:
comment_path GET /comments/:id(.:format) comments#show
您现在拥有comment_path
。没有更多错误消息。
2)调整代码以映射到article_comment_path
取代:
<%= best_in_place comment, :author %>
with:
<%= best_in_place [@article, comment], :author %>
数组[@article, comment]
将通过向@article附加注释来构建帮助路径article_comment_path