在rails应用程序中使用服务类

时间:2018-01-08 18:35:01

标签: ruby-on-rails ruby-on-rails-5

所以,我创建了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

1 个答案:

答案 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

最后,您仍然希望检查这些服务对象调用的返回值,以确定调用是成功还是失败并正确处理。您目前正在重定向。