未定义的方法`model_name'对于嵌套路由

时间:2016-06-07 08:21:44

标签: ruby-on-rails-4 routes form-for

我想设置我的模型,以便我的帖子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

1 个答案:

答案 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应该处理路由。