Form_For未定义的方法路径

时间:2012-12-11 16:46:59

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

我正在尝试使用嵌套资源:

我的路线:

  resources :conversations do
    resources :replies do
      resources :comments
    end
  end

我能够获得回复的表单以便与对话一起工作,但现在我正在添加额外的复杂性来获取评论以使用回复。

整个表格都在会话展示路径下。

<%= form_for([@conversation, @reply]) do |f| %>
    <%= render 'shared/response_form', f: f %>
    <%= f.submit "Reply", class: "btn btn-large btn-primary" %>
<% end %>

上面的回复表单工作正常并且没有错误,下面的注释表单会出错:

未定义的方法`reply_comments_path'

<%= form_for([@reply, @comment]) do |f| %>
    <%= render 'shared/response_form', f: f %>
    <%= f.submit "Comment", class: "btn btn-large btn-primary" %>
<% end %>

这是我的演讲控制器,这是我认为问题所在:

  def show
    @conversation = Conversation.find(params[:id])
    @replies = @conversation.replies
    @reply = current_user.replies.build
    #If I change the above line to @conversations.replies.build 
    #it breaks the ability to show replies above the form.

    @comments = @reply.comments
    @comment = @reply.comments.build    
  end

然而,其他人建议这样做:

<%= form_for([@conversation, @reply, @comment]) do |f| %>
    <%= render 'shared/response_form', f: f %>
    <%= f.submit "Comment", class: "btn btn-large btn-primary" %>
<% end %>

但它最终只出现了路由错误:

No route matches {:controller=>"comments", :format=>nil, :conversation_id=>#<Conversation id: 3, content: "Goes here.", user_id: 1, created_at: "2012-12-10 21:20:01", updated_at: "2012-12-10 21:20:01", subject: "Another conversation">, :reply_id=>#<Reply id: nil, content: nil, user_id: 1, created_at: nil, updated_at: nil, conversation_id: nil>}

当我尝试制作新表格时,我总是得到这个未定义的方法路径错误,我总是设法忘记我做错了什么。答案似乎永远不是路线。

编辑:

在控制器的创建部分我有:

@replies = @conversation.replies
@reply = current_user.replies.build
#If I change the above line to @conversations.replies.build 
#it breaks the ability to show replies above the form.

我不知道为什么@reply = @ conversation.replies.build会破坏显示现有回复的能力。我收到一个错误,说它无法将nil转换为数字,并且无法看到reply.created_at或reply.content。无论造成什么,这可能是我为什么遇到这个问题的线索。但是,在回复控制器中我使用

@reply = conversation.replies.build(content: params[:reply][:content], user_id: current_user.id)

编辑:

只是要补充一点,Stackoverflow做的事与我在这里尝试的非常相似,只不过你可以对问题和答案发表评论。

1 个答案:

答案 0 :(得分:3)

查看错误的结尾:

... :reply_id=>#<Reply id: nil, content: nil, user_id: 1, created_at: nil, updated_at: nil, conversation_id: nil>}

如果未保存@comment,则无法为@reply创建表单。在创建@reply之前,您需要保留@comment

如果你没有在回复模型上验证,请在show action上尝试这个简单的测试:

# @reply = current_user.replies.build
@reply = current_user.replies.create

请参阅评论以获得答案。