2016-06-07 3 views
0

Я хочу настроить свои модели, чтобы мои сообщения has_many Комментарии и комментарии has_many Replies. Комментарии работают нормально. Но моя заявка начинает ломаться, говоря, чтоundefined method `model_name 'для вложенных маршрутов

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

Вы почти там, но вы не передаете параметры, чтобы получить желаемый результат. На данный момент вы передаете строку url, где рельсы ожидают объект ресурса, следовательно, исключение неопределенного метода.

form_for (запись, опции = {}, & блок)

Метод принимает запись и хэш опций, которые не являются обязательными.

Подозреваемый линия

<%= form_for [@reply, post_comment_replies_path(@post, comment)] do |f| %> 

квадратные скобки должны использоваться только для определения ресурса и связанные с ним ресурсы, которые затем используются для создания пути URL. Вы также должны явно указывать свой url в хэшах параметров, если это не может быть выведено из ресурсов, которые вы передаете в form_for.

Поэтому он должен выглядеть примерно так, соблюдая то, как вы делаете что-то.

<%= form_for @reply, url: post_comment_replies_path(@post, comment) do |f| %> 

В этом случае, если вы хотите указать URL-адрес в form_for. Однако почему бы вам просто не разрешить рельсы генерировать URL-адрес для вас?

<%= form_for [@post, comment, @reply] do |f| %> 

В этом случае рельсы должны обрабатывать маршруты.

+0

'<% = form_for @reply, url: post_comment_replies_path (@post, comment) do | f | %> ' дает ту же ошибку. И '<% = form_for [@post, comment, @reply] do | f | %> 'говорит, что первый аргумент не может быть пустым. –