我有以下型号:
class Post < ApplicationRecord
belongs_to :site
has_one :metric, dependent: :destroy
end
class Metric < ApplicationRecord
belongs_to :post
end
我想创建一个端点,该端点在被调用时会聚合发送的数据,而不仅仅是更新它。因此,在我的路线中,我将通常的put "metrics", to: "metrics#update
更改为patch "metrics", to: "metrics#update
,我的控制器如下所示:
class MetricsController < ApplicationController
before_action :set_post, only: [:update]
def update
# TODO
end
private
def set_post
@post = Post.find_by(post_id: params[:post_id])
end
end
首先要注意的是,应该调用所有路由而不是通过METHOD /{id}
来代替通常的post_id
。尽管这听起来很怪异,但对我的用例却是有意义的–全世界的wordpress博客(希望是哈哈)都会向该端点发送指标,而他们唯一知道的就是唯一的ID(site_id
)和wordpress博客帖子ID(存储在wordpress数据库中的ID)(我在数据库中称其为post_id
)。
为示例起见,假设我的模型只有以下列:
sentiment
word_count
paragraph_length
现在,我希望您提供以下帮助:如果请求正文中存在这些属性,如何确认?
谢谢
答案 0 :(得分:1)
您可以添加以下私有方法并在更新之前调用它,以检查是否存在参数
def is_params_present?
["sentiment","word_count","paragraph_length"].all? {|k| params.has?(k) && params[k].present?}
end
答案 1 :(得分:1)
Presath的回答应该很好。也具有模型级验证也很好。例如:
class Metric < ApplicationRecord
belongs_to :post
validates_presence_of :sentiment, message: "can't be blank"
validates_presence_of :word_count, message: "can't be blank"
validates_presence_of :paragraph_length, message: "can't be blank"
end