У меня есть действие, выполняемое с каждым методом create, update и update_status на моем контроллере, но я чувствую, что повторяюсь, и буду очень признателен за помощь в улучшении подхода к написанию этого.
Я абстрагировал логику обновления для службы, но параметры разные для каждого метода моего контроллера.
def create
@story = Story.new(story_params)
@story.creator = current_user
if @story.save
next_state = StoryStateService.new(@story, current_user, nil).call
if next_state
@story.update_column(:status_id, next_state)
end
redirect_to stories_path
else
render 'stories/new'
end
end
def update
@story = Story.find(params[:id])
if @story.update(story_params)
next_state = StoryStateService.new(@story, current_user, nil).call
if next_state
@story.update_column(:status_id, next_state)
end
redirect_to stories_path
else
render 'edit'
end
end
def update_story_status_event
story = Story.find(params['story_id'])
sub_action = params['sub_action']
next_state = StoryStateService.new(story, current_user, sub_action).call
if next_state
story.update_column(:status_id, next_state)
end
redirect_to stories_path
end
Как видите, у меня
next_state = StoryStateService.new(story, current_user, sub_action).call
if next_state
story.update_column(:status_id, next_state)
end
повторяется для трех методов, но при обычном создании и обновлении мне не нужно отправлять параметр sub_action (строку).