在模型中处理来自控制器的 POST 数据
Manipulating POST Data from Controller in Model
我正在从事一个项目,目标是发布一个字符串并返回该字符串的每三个字符。该项目是在 Ruby/Rails.
中构建的
我有(hacky)逻辑来取出第三个元素,把它放在一个新字符串中,然后用数据库中的新对象保存这个新字符串,但我现在的问题是这个逻辑是在控制器中完成的。我真的很想遵循 MVC,所以我的目标是将所有这些逻辑都放入模型中。
目前,我的控制器中的 *params
和 create
方法如下所示:
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
我正在从事一个项目,目标是发布一个字符串并返回该字符串的每三个字符。该项目是在 Ruby/Rails.
中构建的我有(hacky)逻辑来取出第三个元素,把它放在一个新字符串中,然后用数据库中的新对象保存这个新字符串,但我现在的问题是这个逻辑是在控制器中完成的。我真的很想遵循 MVC,所以我的目标是将所有这些逻辑都放入模型中。
目前,我的控制器中的 *params
和 create
方法如下所示:
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