2015-10-03 2 views
1

Я знаю, что подобные вопросы были заданы по этой теме, и я прочитал их все и не смог найти четкое решение. Прежде чем я изложу свою проблему, я отправлю все необходимые коды.Метод Create в контроллере комментариев не работает. Rails

Модели:

class Comment < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :scoreboard 
    end 

class User < ActiveRecord::Base 
    has_many :scoreboards, dependent: :destroy 
    has_many :comments, dependent: :destroy 
end 

class Scoreboard < ActiveRecord::Base 
    belongs_to :user 
    has_many :teams, dependent: :destroy 
    has_many :comments, dependent: :destroy 
end 

Счет похож на страницу статьи, где пользователи могут оставлять комментарии.

Миграции для Комментариев:

class CreateComments < ActiveRecord::Migration 
    def change 
    create_table :comments do |t| 
     t.text :body 
     t.text :reply 
     t.references :user, index: true 
     t.references :scoreboard, index: true 

     t.timestamps null: false 
    end 
    add_foreign_key :comments, :users 
    add_foreign_key :comments, :scoreboards 
    end 
end 

Проблемы заключается с создать метод в контроллере комментариев. Вот код для метода:

def create 
    @scoreboard = Scoreboard.find(params[:scoreboard_id]) 
    @comment.user_id = current_user.id 
    @comment = @scoreboard.comments.build(comment_params) 
    redirect_to scoreboard_url(@comment.scoreboard_id) 
    end 

Метод current_user расположен в хелперах файл в отдельной папке. Всякий раз, когда я представляю форму для нового комментария, я получаю следующее сообщение об ошибке:

undefined method `user_id=' for nil:NilClass 

Один из вопросов стека заявил, что столбец user_id требуется в комментариях, и когда я попытался мигрировать сказал он дублируется столбец не может быть создан. Может ли это, потому что есть внешний ключ для пользователей, уже присутствующих в миграции? Что я могу делать неправильно?

ответ

2

Ошибка довольно проста:

@comment.user_id = current_user.id 
@comment = @scoreboard.comments.build(comment_params) 

Вы звоните @comment без определив его ранее.

Это должно быть так:

@comment = @scoreboard.comments.build comment_params 
@comment.user_id = current_user.id 

One of the questions on stack stated that a user_id column is needed in comments

Чтобы уточнить, что они имели в виду foreign_key в Comment модели.

Вы должны помнить, что Rails построен на вершине relational database:

enter image description here

Какой бы вариант SQL вы используете, вы все равно будете использовать его в реляционную образом; к которому Rails добавила ActiveRecord "object relational mapper".

Просто это дает Rails возможность звонить ассоциативный данные с различными запросами и т. Д. Мы не видим никаких технических проблем; только ассоциация @scoreboard.comments.

В бэкэнд Rails необходимо вычислить, какие данные связаны с другим. Это может только происходит при использовании соответствующих структур реляционных баз данных, включая использование foreign_keys.

Именно поэтому при создании связанных объектов необходимо назначить user_id. Существует хитрость, чтобы сделать ее более кратким:

#app/controllers/comments_controller.rb 
class CommentsController < ApplicationController 
    def create 
    @scoreboard = Scoreboard.find params[:scoreboard_id] 
    @comment = @scoreboard.comments.build comment_params 
    end 

    private 

    def comment_params 
     params.require(:comment).permit(:params).merge(user_id: current_user.id) 
    end 
end 
+0

Wow haha. Спасибо. – kpaul

+0

Это, если ваш другой код в порядке. –

+1

Проблема была именно в том, что вы сказали. Теперь это исправлено. Спасибо! – kpaul

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