2016-06-12 72 views
0

我現在有一個Subscriber模型和Comment模型。該Subscriber的has_many commentscomment belongs_to的Subscriber。我只希望訂閱者能夠在文本字段中發表評論,並且該評論通過ID屬於該訂閱者。出於某種原因,我無法弄清楚這一點,而且我正在經歷艱難的時間尋求幫助。所以,很清楚我對comment模型subscriber_id,我該如何連接在一起,這樣我可以在Rails的控制檯此調用 - @comment = @subscriber.comments.first看到屬於該特定用戶的第一個評論?爲了清楚起見,我將展示一些代碼。加入兩款車型使用Rails

SCHEMA:

  create_table "comments", force: :cascade do |t| 
t.string "description" 
t.datetime "created_at", null: false 
t.datetime "updated_at", null: false 
t.string "fav_drink" 
t.string "visit_time" 
t.integer "subscriber_id" 
end 

create_table "subscribers", force: :cascade do |t| 
t.string "first_name" 
t.string "last_name" 
t.string "email" 
t.string "phone_number" 
t.string "birthdate" 
t.string "street_1" 
t.string "street_2" 
t.string "city" 
t.string "zip" 
t.string "state" 
t.datetime "created_at", null: false 
t.datetime "updated_at", null: false 
t.integer "visit" 
end 

控制器:

class CommentsController < ApplicationController 
def new 
    @comment = Comment.new 
end 

def create 
    @comment = Comment.create(comments_params) 
    if @comment.save 
    flash[:notice] = "Thank you!" 
    redirect_to subscribers_search_path(:comments) 
    else 
    render "new" 
    end 
end 

private 

def comments_params 
    params.require(:comment).permit(:fav_drink, :subscriber_id) 
end 
end 



class SubscribersController < ApplicationController 
def index 
    @subscriber = Subscriber.all 
end 

def new 
    @subscriber = Subscriber.new 
end 

def create 
    @subscriber = Subscriber.create(subscriber_params) 
    if @subscriber.save 
    flash[:notice] = "Subscriber Has Been Successfully Created" 
    redirect_to new_subscriber_path(:subscriber) 
    else 
    render "new" 
    end 
end 

而模型是如在介紹中描述。謝謝!

+0

除非我失去了一些東西,這看起來像一個標準的'has_many'關係。如果它不像您期望的那樣工作,您還需要包含模型的代碼。 –

+0

是的。也許我錯過了一些東西,但我無法弄清楚如何將兩者聯繫起來。現在,如果我在視圖中設置的文本字段中留下評論,我肯定會收到該評論,但我不會附加到任何特定訂閱者。這就是我想要的評論實際上屬於某人。我很難問這個問題,因爲我真的迷失瞭解決方案 – Bitwise

回答

0

有多種方法:

方法1:使用CURRENT_USER/LOGGED_IN用戶

如果訂戶假想登錄到系統, 並且如果CURRENT_USER是參照LOGGED_IN 訂戶,那麼你可以在創建之前將current_user分配給 評論。

class CommentsController < ApplicationController 
    def new 
    @comment = Comment.new 
    end 

    def create 
    @comment = current_user.comments.build(comments_params) 

    if @comment.save 
     flash[:notice] = "Thank you!" 
     redirect_to subscribers_search_path(:comments) 
    else 
     render "new" 
    end 
    end 

    private 

    def comments_params 
    params.require(:comment).permit(:fav_drink) 
    end 
end 

方法2:隱藏域

在評論形式設置一個subscriber_id hidden_​​field然後 您現有的實現應該能正常運行。只是爲了澄清 我複製/粘貼你的實現。

class CommentsController < ApplicationController 
    def new 
    @comment = Comment.new 
    end 

    def create 
    @comment = Comment.new(comments_params) 

    if @comment.save 
     flash[:notice] = "Thank you!" 
     redirect_to subscribers_search_path(:comments) 
    else 
     render "new" 
    end 
    end 

    private 

    def comments_params 
    params.require(:comment).permit(:fav_drink, :subscriber_id) 
    end 
end 

方法3:嵌套資源

使用rails嵌套的資源,設置您的路線如下:

resources :subscribers 
    resources: comments, only: [:new, :create] 
end 

然後更新控制器代碼如下:

class CommentsController < ApplicationController 
    def new 
    @comment = Comment.new 
    end 

    def create 
    @subscriber = Subscriber.find(params[:subscriber_id]) 
    @comment = @subscriber.comments.build(comments_params) 

    if @comment.save 
     flash[:notice] = "Thank you!" 
     redirect_to subscribers_search_path(:comments) 
    else 
     render "new" 
    end 
    end 

    private 

    def comments_params 
    params.require(:comment).permit(:fav_drink) 
    end 
end 
+0

獲取感謝您的幫助!我打算使用3號碼,但在嘗試實施時出現錯誤。 '無法找到'id'='任何想法爲什麼我得到這個錯誤? – Bitwise

+0

檢查正在接收的'params [:subscriber_id]'的值到'create'動作的值。 – Dharam

0

有幾種方法可以解決這個問題。我想強調以下3:

  1. 使用嵌套資源的路線,例如:

    資源:用戶做 資源:評論 結束

使用這種方法,你的路由會成爲用戶/ 1 /評論...在你的comments_controller,你可以從params[:subscriber_id]

獲取你的用戶
  • 如果用戶是CURRENT_USER,你還可將其設置成你的comments_controller這樣:

    current_user.comments.create(comments_params)

  • 使用隱藏字段在comments/form來設置用戶。

  • 基本上,看着你comments_params,你需要subscriber_id,這是不被傳遞給控制器​​。所以你需要一種傳遞方式。

    您可以在create/new行動前設置你的用戶,然後做:

    @subscriber.comments.[create|new]然後在new評論表單視圖,你將有f.hidden_field :subscriber_id

    讓我知道是否可行。

    +0

    它不是current_user,所以我最喜歡的選項是3號。我是rails新手,我還沒有編寫隱藏字段。無論如何,你可以詳細說明/例子在我的情況下會是什麼樣子? – Bitwise

    +0

    是的,基本上在你的'form_for'塊中,你將有一個'f.hidden_​​field:subscriber_id'。不過,對於你的用戶是誰,我會有點好奇。它是一個用戶嗎?用戶如何獲取或創建等?你需要一種方式來跟蹤用戶,這就是爲什麼嵌套資源也可能有意義,這不需要用戶,但用戶將從路線 – oreoluwa