使用 Rails 加入两个模型
Joining two models with Rails
我目前有一个 Subscriber
模型和一个 Comment
模型。 Subscriber
has_many comments
和 comment
belongs_to Subscriber
。我想要的只是让订阅者能够在文本字段中发表评论,并且该评论通过 ID 属于该订阅者。出于某种原因,我无法弄清楚这一点,而且我很难获得帮助。所以,非常清楚,我在 comment
模型上有一个 subscriber_id
,我如何将它们连接在一起,以便我可以在 Rails 控制台中进行此调用 - @comment = @subscriber.comments.first
并查看属于该特定订户的第一条评论?为了清楚起见,我将展示一些代码。
架构:
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
模型如简介中所述。谢谢!
有几种方法可以解决这个问题。我会在下面突出显示 3:
使用嵌套资源路由,例如:
资源:订阅者做
资源:评论
结束
使用这种方法,您的路线将变为 subscribers/1/comments...并且在您的 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
如果可行,请告诉我。
有多种方法:
方法一:使用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
方法二:隐藏字段
在评论区设置一个subscriber_id hidden_field 然后
您现有的实施应该可以正常工作。只是为了澄清
我是 copy/pasting 你的实现。
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
我目前有一个 Subscriber
模型和一个 Comment
模型。 Subscriber
has_many comments
和 comment
belongs_to Subscriber
。我想要的只是让订阅者能够在文本字段中发表评论,并且该评论通过 ID 属于该订阅者。出于某种原因,我无法弄清楚这一点,而且我很难获得帮助。所以,非常清楚,我在 comment
模型上有一个 subscriber_id
,我如何将它们连接在一起,以便我可以在 Rails 控制台中进行此调用 - @comment = @subscriber.comments.first
并查看属于该特定订户的第一条评论?为了清楚起见,我将展示一些代码。
架构:
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
模型如简介中所述。谢谢!
有几种方法可以解决这个问题。我会在下面突出显示 3:
使用嵌套资源路由,例如:
资源:订阅者做 资源:评论 结束
使用这种方法,您的路线将变为 subscribers/1/comments...并且在您的 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
如果可行,请告诉我。
有多种方法:
方法一:使用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
方法二:隐藏字段
在评论区设置一个subscriber_id hidden_field 然后 您现有的实施应该可以正常工作。只是为了澄清 我是 copy/pasting 你的实现。
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