在模型中处理来自控制器的 POST 数据

Manipulating POST Data from Controller in Model

我正在从事一个项目,目标是发布一个字符串并返回该字符串的每三个字符。该项目是在 Ruby/Rails.

中构建的

我有(hacky)逻辑来取出第三个元素,把它放在一个新字符串中,然后用数据库中的新对象保存这个新字符串,但我现在的问题是这个逻辑是在控制器中完成的。我真的很想遵循 MVC,所以我的目标是将所有这些逻辑都放入模型中。

目前,我的控制器中的 *paramscreate 方法如下所示:

Class TestController < ApplicationController

...

def create
     new_output_string = params[:input_string].split("")
     final_output_string_array = []
     counter = 1
     new_output_string.each do |letter|
      if counter % 3 == 0
        final_output_string_array.append(letter)
      end      
      counter = counter + 1
    end
    final_output_string = final_output_string_array.join("")
    @test = Test.create(
      input_string: params[:input_string], 
      output_string: final_output_string
    )
    render json: @test
  end

  def test_params
    params.require(:test).permit(:input_string, :output_string)
  end

所以你可以看到所有操作这些数据的逻辑都在控制器中。我尝试在模型中写一个方法 make_output_string:

Class Test < ApplicationRecord

    def self.make_output_string()
        new_output_string = params[:input_string].split("")
        final_output_string_array = []
        counter = 1
        new_output_string.each do |letter|
          if counter % 3 == 0
            final_output_string_array.append(letter)
          end      
          counter = counter + 1
        end
        @final_output_string = final_output_string_array.join("")
    end

我希望这会在 create 操作(我尝试使用 before_create 等)调用 before_create 之前操作数据,并在控制器的创建方法中引用该方法,但我要么得不到结果,要么得不到 undefined method 错误。

如何将我的逻辑移动到模型中,以便它可以处理 manipulation/creation 参数?

您应该在模型上为 input_string 创建自定义 setter 并保存 input_string 和 output_string。

Class Test < ApplicationRecord

    def input_string=(input_string)
        super(input_string)
        self.output_string = generate_output(input_string)
    end


    private

    def generate_output(input_string)
      new_output_string = input_string.split("")
      final_output_string_array = []
      counter = 1
      new_output_string.each do |letter|
        if counter % 3 == 0
          final_output_string_array.append(letter)
        end      
        counter = counter + 1
      end
      final_output_string_array.join("")
    end
end

那么你的控制器就会像下面这样。

Class TestController < ApplicationController
  def create
    @test = Test.create(input_string: params[:input_string])
    render json: @test
  end

  def test_params
    params.require(:test).permit(:input_string, :output_string)
  end
end