Рефакторинг: как эффективно визуализировать json в действии обновления Rails - PullRequest
1 голос
/ 29 апреля 2011

Как я могу реорганизовать этот код, чтобы не повторять объекты json снова и снова, когда они используют один и тот же базовый формат?Мне все еще немного неловко с Ruby on Rails, поэтому я не уверен, как лучше подойти к этому.

  # PUT /users/:user_id/profile/:id
  def update
    if request.xhr?
      profile = current_user.profile

      if params[:profile].blank?
        render :json => { :error => "There was no profile data passed in so your profile could not be saved." }, 
               :status => :unprocessable_entity
      else
        if profile.update_attributes(params[:profile])
          render :json => { :interests => 
                              simple_format(h(profile.interests), :class => "pbs tl"),
                            :favorite_music =>
                              simple_format(h(profile.favorite_music), :class => "pbs tl"),
                            :favorite_movies =>
                              simple_format(h(profile.favorite_movies), :class => "pbs tl"),
                            :favorite_books =>
                              simple_format(h(profile.favorite_books), :class => "pbs tl"),
                            :favorite_foods =>
                              simple_format(h(profile.favorite_foods), :class => "pbs tl") },
                 :status => :ok
        else
          render :json => { :error => get_errors_for_class(profile).to_sentence }, 
                 :status => :unprocessable_entity
        end
      end
    end
  end

Обновление : я изменил оригинальный ответмало и у меня это работает.Вот моя модификация:

  # within profile.rb
  # create a hash of profile attributes
  def html_to_hash
    %w{interests favorite_music favorite_books favorite_foods}.inject({}) do |hash, property|
      hash[property] = simple_format(h(self.send(property)), :class => 'pbs tl')
      hash
    end    
  end

Ответы [ 2 ]

3 голосов
/ 29 апреля 2011

Сделать данные в этом огромном хэше методом Profile.

class Profile
  def to_hash
    [:interests, :favorite_music, :favorite_books, :favorite_foods].inject({}) do |h, prop|
      h[prop] = simple_format(h(self.send(:prop)), :class => 'pbs tl')
      h
    end
  end
end

затем

# PUT /users/:user_id/profile/:id
  def update
    if request.xhr?
      profile = current_user.profile

      if params[:profile].blank?
        render :json => { :error => "There was no profile data passed in so your profile could not be saved." }, 
               :status => :unprocessable_entity
      else
        if profile.update_attributes(params[:profile])
          render :json => profile.to_hash,
                 :status => :ok
        else
          render :json => { :error => get_errors_for_class(profile).to_sentence }, 
                 :status => :unprocessable_entity
        end
      end
    end
  end
0 голосов
/ 11 сентября 2014

Вы можете создать метод as_json в своем классе Profile, который возвращает тот же хеш, а затем просто выполните render :json => profile. Другой вариант - подключить ActiveModel :: Serializer и сообщить ему, какие атрибуты вы хотите сериализовать и как.

...