2015-10-03 106 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

爲了澄清,他們指的是Comment模型的foreign_key

你必須記住的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

哇哈哈。謝謝。 – kpaul

+0

這就是如果你的其他代碼是好的。 –

+1

問題正是你所說的。現在已經修復了。謝謝! – kpaul

相關問題