Рельсы, сохраняющие параметры DRY - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть модель с именем "seo"

class Seo < ApplicationRecord
    belongs_to :seoable, polymorphic: true
    # more code
  end

Многие модели в моем приложении has_one seo.Например,

 class Post < ApplicationRecord
    has_one :seo, as: :seoable
    accepts_nested_attributes_for :seo, dependent: :destroy
    # more code
  end

Мой вопрос заключается в том, как лучше сохранить параметры в моих контроллерах сухими.Например, у меня есть следующий код в моем posts_controller

def post_params
  params.require(:post).permit(seo_attributes: [:id, :title, :meta_description, :etc])
end

Каждая модель будет повторять вышеописанное.Как мне сохранить эту СУХУЮ?

Ответы [ 4 ]

2 голосов
/ 20 сентября 2019

Я думаю, что это пример, где вы можете использовать беспокойство :

# in app/models/concern/seoable.rb
require 'active_support/concern'

module Seoable
  extend ActiveSupport::Concern
  included do
    has_one :seo, as: :seoable
    accepts_nested_attributes_for :seo, dependent: :destroy
  end
end

# in your models
class Post < ApplicationRecord
  include Seoable
end

А для контроллеров вы можете добавить метод в AplicationController, который позволяет упростить вызов:

# in the application_controller
def params_with_seo_attributes(namespace)
  params.require(namespace).permit(seo_attributes: [:id, :title, :meta_description, :etc])
end

# and use it in your controllers like this
def post_params
  params_with_seo_attributes(:post)
end
0 голосов
/ 20 сентября 2019

Так что, если has_one :seo, as: :seoable и accepts_nested_attributes_for :seo, dependent: :destroy повторяются в нескольких моделях, вы можете использовать Rails Concerns для него.

Если вы хотите узнать, как заставить проблемы видеть этот вопрос

0 голосов
/ 20 сентября 2019

У вас может быть базовый контроллер, подобный приведенному нижеБлог следующим образом

class BlogController < ResourceController    
                def resource_name
                    :blog
                end
    end
0 голосов
/ 20 сентября 2019

Вы можете создать один контроллер с таким методом post_params, и тогда остальные контроллеры, которым он нужен, могут наследовать от этого контроллера

...