0

Я использую рельсы 4.0.8. Я добавил раздел комментария к модели под названием «Вещи», но я все равно получаю ту же ошибку. «Параметр отсутствует или значение пуст: вещь», когда я нажимаю кнопку отправки комментариев. Он говорит, что ошибка находится в контроллере Things #. Что я делаю не так?Ошибка: параметр отсутствует или значение пуст: вещь

UPDATE: я удалил путь URL из формы, но новая ошибка возвращает «Не удалось найти Thing без идентификатора». Ошибка находится в контроллере комментариев #.

ВЗГЛЯД НА ВЕЩЬ/ШОУ

<div id= "thing"> 
    <h1> 
    <%= @thing.name %> 
    </h1> 
    <br> 
    <div id= "commentsection"> 
    Comments 
    <div id= "comments"> 
     <br> 
     <% @thing.comments.each do |c| %> 
     <%= c.username %> 
     <br> 
     <%= c.text %> 
     <% end %> 
     <%= form_for @comment, :url => thing_path do |f| %> 

     <%= f.label :username %> 
     <%= f.text_field :username %> 

     <%= f.label :comment %> 
     <%= f.text_field :text %> 

     <%= f.submit "Enter", class: "btn btn-small btn-primary" %> 
     <% end %> 
    </div> 
    </div> 
</div> 

ВЕЩИ CONTROLLER

class ThingsController < ApplicationController 

    def show 
    @thing = Thing.find(params[:id]) 
    @thing.comments.build 
    @comment = Comment.new 
    end 

    def index 
    end 

    def new 
    @thing = Thing.new 
    @things = Thing.all 
    end 

    def create 
    @thing = Thing.new(thing_params) 
    if @thing.save 
     redirect_to @thing 
    else 
     render 'new' 
    end 
    end 

    private 
    def thing_params 
     params.require(:thing).permit(:name, :avatar) 
    end 

end 

КОММЕНТАРИИ CONTROLLER (я поставил звездочку вокруг линии, где ошибка)

class CommentsController < ApplicationController 

    def show 
    @comment = Comment.find(params[:id]) 
    end 

    def new 
    @comment = Comment.new 
    @comments = Comment.all 
    end 

    def create 
    ****@thing = Thing.find(params[:thing_id])**** 
    @comment = @thing.comments.create(comment_params) 
    redirect_to thing_path(@thing) 
    end 
    end 

    private 

    def comment_params 
     params.require(:comment).permit(:user, :text, :upvotes, :downvotes, :thing_id) 
    end 

end 

МАРШРУТЫ

Website::Application.routes.draw do 

    get "comments/new" 
    get "comments/show" 
    get "things/new" 
    root 'home_page#home' 
    get "all/things/new" => 'things#new' 
    get "all/allthings" 
    resources :things 
    resources :good_comments 
    get "things/show" 
    get "things/results" 

end 

ответ

0

Вы отправляете форму @comment на номер post '/things' path.

<%= form_for @comment, :url => thing_path do |f| %> 

Это должно быть просто <%= form_for @comment do %> (Rails достаточно умны, чтобы подключить comments_path), или если вы чувствуете, как быть более явным (хотя это не обязательно)

<%= form_for @comment, url: :comments_path do %> 

Еще одно замечание, хотя, если вы хотите, чтобы Comment быть привязаны к этому конкретному Thing то в вашей модели должно быть

Class Thing 
    has_many :comments 
end 

Class Comment 
    belongs_to :thing 
end 

затем убедитесь, что в база данных comment имеет thing_id foreign_key field и тогда ваша форма для комментариев должно выглядеть на самом деле

<%= form_for @thing, @comment do %> <% end %>

+0

Спасибо! Я удалил бессмысленный URL-адрес, но теперь у меня появилась новая ошибка в комментарии # Controller: «Не удалось найти Thing без ID». Любая идея, почему это может быть? Мои модели настроены правильно, и каждый комментарий имеет thing_id. –

+0

@ user3739453 Ваша форма должна быть '<% = form_for @thing, @comment do%>' В вашем 'Контроллере комментариев' вы запрашиваете' params [: thing_id] ', но URL-адрес вашей формы в настоящее время генерируется, если вы проверяете это '/ comments'. Это должно быть ''/thing /: thing_id/comments'', что также означает, что вам нужно настроить свои маршруты, чтобы включить 'resources: things do resources: comments end' – kittyminky

+0

Хорошо, теперь это дает мне" невозможно написать неизвестный атрибут 'html' "и выделяет строку' <% = form_for @thing, @comment do | f | %> '. –

Смежные вопросы