2016-05-23 1 views
2

В последнее время я начал использовать Rubocop и пытался лучше подумать о моем коде, и если бы я мог писать лучше. У меня есть метод создания и обновления, которые очень похожи. Rubocop жалуется, что метод имеет слишком много строк кода [12/10]. Мне интересно, как вы собираетесь следовать принципу СУХОЙ здесь. Мне кажется, что response_to следует довести до своего частного метода. Но я не могу понять, что было бы лучшим способом сделать это так:DRYing this Ruby code

  1. Вспышка может быть: успех или: опасность
  2. Один проверяет, является ли модели сохранены, а другой, если она обновляется.
  3. Различные рендеринга в зависимости от того, если модель сохранена или если она была ошибка

Я также не знаю, если я просто должен оставить его в покое. Тот факт, что он настолько избыточен, действительно подходит ко мне. Окончательный Я хочу иметь чистый код, я просто не уверен, если я должен сохнуть этот метод

def create 
    @category = Category.new(category_params) 

    respond_to do |format| 
     if @category.save 
     flash[:success] = 'Category Successfully Created' 
     format.html { redirect_to admin_category_path(@category) } 
     format.json { render :show, status: :created, location: @category } 
     else 
     flash[:danger] = 'Errors in creating category, see below' 
     format.html { render :new } 
     format.json { render json: @category.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    def update 
    @category = Category.find(params[:id]) 

    respond_to do |format| 
     if @category.update(category_params) 
     flash[:success] = 'Category Successfully updated!' 
     format.html { redirect_to admin_category_path(@category) } 
     format.json { render :show, status: :created, location: @category } 
     else 
     flash[:danger] = 'Errors in updating category, missing information' 
     format.html { redirect_to action: 'edit', id: @category.id } 
     format.json { render json: @category.errors, status: :unprocessable_entity } 
     end 
    end 
    end 
+0

Отличный вопрос! Тем не менее, голосование закрывается как «в основном основанное на мнениях», потому что есть более одного правильного ответа. –

+0

Поскольку это рабочий код, он не подходит для SO. Вы должны опубликовать его на [CodeReview] (http://codereview.stackexchange.com/). –

ответ

1

Это не имеет никакого смысла, чтобы попытаться сделать один метод из create и update, поскольку они служат два очень разные цели.

Вместо этого вы могли бы рассмотреть следующие вещи:

  • вы действительно нуждаетесь в формате JSON? Если вы не используете его, вы можете безопасно удалить эти строки;
  • удалить @category = Category.find(params[:id]) из update и переместить его в метод в before_action

    before_action :find_category, only: [:edit, :update] 
    
    def find_category 
        @category = Category.find(params[:id]) 
    end 
    
  • последнее, но не в последнюю очередь, Rubocop не всегда правильный ответ: фокус на четкостью!

+0

Спасибо за ваш ответ. Это была моя большая проблема, я в конечном итоге хотел иметь ясность. Я буду работать над некоторыми вашими предложениями, хотя и посмотрю, как это происходит! – ajk4550

0

Все операции с успешным выполнением одинаковы, за исключением одного слова в сообщении; и обработка JSON при ошибке идентична. Таким образом, эти части могут быть извлечены в методы, называемые как созданием, так и обновлением. Мало того, что код будет более кратким, для читателя было бы очевидно, какое поведение было идентичным и какое поведение отличалось. Я не запускать или тестировал этот код, но здесь это:

def handle_success(created_or_updated) 
    verb = created_or_updated == :created ? 'Created' : 'Updated' 
    flash[:success] = "Category Successfully #{verb}" 
    format.html { redirect_to admin_category_path(@category) } 
    format.json { render :show, status: :created, location: @category } 
end 


def handle_failure_json 
    format.json { render json: @category.errors, status: :unprocessable_entity } 
end 


def create 
    @category = Category.new(category_params) 

    respond_to do |format| 
    if @category.save 
     handle_success(:created) 
    else 
     flash[:danger] = 'Errors in creating category, see below' 
     format.html { render :new } 
     handle_failure_json 
    end 
    end 
end 


def update 
    @category = Category.find(params[:id]) 

    respond_to do |format| 
    if @category.update(category_params) 
     handle_success(:updated) 
    else 
     flash[:danger] = 'Errors in updating category, missing information' 
     format.html { redirect_to action: 'edit', id: @category.id } 
     handle_failure_json 
    end 
    end 
end