我想设置我的模型,以便我的帖子has_many评论和评论has_many回复。评论工作正常。但我的申请开始打破
undefined method `model_name' for "/posts/adas/comments/11/replies":String
当我尝试设置评论的回复时。我无法弄清楚是什么触发了这个错误。我可以从我的Rails控制台添加回复,并在视图中查看它们,但添加form_for标记会破坏代码。任何人都可以指出错误是什么以及我应该如何路由它?
帖子#show.html.erb
<h2>Comments</h2>
<% @post.comments.each do |comment| %>
<p>
<b><%= comment.username %></b>
<%= comment.name %>
<% if current_user.email == comment.username || current_user.admin? %>
<%= link_to 'Delete', [comment.post, comment],
:confirm => 'Are you sure?', :method => :delete %>
<% end %>
<p style = "text-indent: 3em">
<% comment.replies.each do |reply| %>
<i><%= reply.author %></i>
<%= reply.content %>
<% end %>
<%= form_for [@reply, post_comment_replies_path(@post, comment)] do |f| %>
<%= f.label :reply %>
<%= f.text_field :content %>
<%= f.submit("Reply") %>
<% end %>
<% end %>
</p>
</p>
<h3>Add a comment:</h3>
<%= form_for([@post, @post.comments.build]) do |f| %>
<%= f.label :comment %><br />
<%= f.text_area :name %>
<%= f.submit %>
<% end %>
replies_controller.rb
class RepliesController < ApplicationController
def create
@reply = @comment.replies.create(reply_params)
redirect_to post_path(@post)
end
private
def reply_params
params.require(:reply).permit(:content)
end
end
的routes.rb
Rails.application.routes.draw do
devise_for :users, :controllers => { :omniauth_callbacks => "callbacks" }
root 'welcome#index'
resources :posts do
resources :comments do
resources :replies
end
member do
put "like", to: "posts#upvote"
end
end
end
答案 0 :(得分:0)
你几乎就在那里,但是你没有以正确的方式传递参数来获得你想要的结果。目前你正在传递一个url字符串,其中rails期望一个资源对象,因此未定义的方法异常。
form_for(record,options = {},&amp; block)
该方法采用记录和可选的选项哈希。
可疑线是
<%= form_for [@reply, post_comment_replies_path(@post, comment)] do |f| %>
方括号只应用于定义资源及其相关资源,然后用于生成网址路径。您还应该在选项哈希中明确说明您的URL,除非可以从传递给form_for的资源中推断出它。
所以它应该看起来像这样,保持你做事的方式。
<%= form_for @reply, url: post_comment_replies_path(@post, comment) do |f| %>
如果您想在form_for中指定网址,则会出现这种情况。但是,为什么不让rails为你生成网址?
<%= form_for [@post, comment, @reply] do |f| %>
这样rails应该处理路由。