所以,我创建了app/services
文件夹,然后用.call
方法创建了一些类(我试图理解服务和查询对象的逻辑)
app/services/add_comment_to_post.rb
class AddCommentToPost
def initialize(post:, comment:)
@post = post
@comment = comment
end
def call
@post.comments.create(@comment)
@post
end
end
app/services/remove_comment_from_class.rb
class RemoveCommentFromPost
def initialize(post:, comment:)
@post = post
@comment = comment
end
def call
@post.comments.@comment.id.destroy
@post
end
end
和comments_controller.rb
def create
#this one works:
#@post.comments.create! comment_params
AddCommentToPost.new(@post, @comment).call
redirect_to @post
def destroy
RemoveCommentFromPost.new(@post,@comment).call
redirect_to @post
任何人都可以告诉我应该更改什么才能使其正常工作,或者在哪里寻找类似的例子?帖子和评论是脚手架,我使用嵌套路线。
Rails.application.routes.draw do
resources :posts do
resources :comments
end
root "posts#index"
end
答案 0 :(得分:1)
一般情况下,如果您包含您从您尝试的内容中获得的错误,那么它会很有帮助。在这种情况下,我扫描了代码,发现了一些你应该纠正的错误。
您的服务对象定义了initialize
方法def initialize(post:, comment:)
@post = post
@comment = comment
end
,如下所示:
AddCommentToPost.new(@post, @comment).call
但是你通过传递位置参数来初始化它们:
AddCommentToPost.new(post: @post, comment: @comment).call
您应该使用预期的关键字参数初始化它们,如下所示:
destroy
此外,正如上面粘贴的那样,您的def destroy
RemoveCommentFromPost.new(@post,@comment).call
redirect_to @post
方法:
end
缺少model
。
最后,您仍然希望检查这些服务对象调用的返回值,以确定调用是成功还是失败并正确处理。您目前正在重定向。