Pergunta

Estou tentando modificar o plugin vestal_versions para aceitar um parâmetro que defini ao salvar.Este parâmetro atuará como um novo sinalizador para determinar quando criar uma revisão após a atualização.Atualmente ele sempre será executado após atualização quando uma nova revisão for necessária.Aqui está a área afetada do código do plugin não modificado:

after_update :create_version, :if => :needs_version?

    def create_version
        versions.create(:changes => changes.slice(*versioned_columns), :number => (last_version + 1))
        reset_version
    end 

O parâmetro que estou enviando na visualização ao enviar é "forcerevision=n".Como eu extrairia esse parâmetro e qual condicional usaria para permitir que isso fosse executado apenas quando "forcerevision = y"?Parece que seria mais limpo modificar o filtro after_update?

Aqui está o log dos dados sendo transmitidos na atualização.

Processing NotesController#update (for 521.0.0.1 at 2009-12-05 13:25:45) [PUT]
Parameters: {"authenticity_token"=>"#########################+k=", "id"=>"4", "forcerevision"=>"n", "note"=>{"notebook_id"=>"", "public"=>"n", "body"=>"A versioned note", "title"=>"Version Note Test", "flag"=>"important", "star"=>"false", "tag_list"=>""}}

vestal_versions no Github

Foi útil?

Solução

A maneira mais limpa de fazer isso seria adicionar um attr_accessor quando um modelo for declarado como versionado.

Em seguida, substitua need_version?para verificar esse atributo.

Em qualquer lugar em LaserLemon::VestalVersions::ClassMethods#versioned adicione esta linha:

attr_accessor :force_reversion

Em seguida, reescreva LaserLemon::VestalVersions::InstanceMethods#needs_version?para verificar este atributo:

N. B.devido à forma como as caixas de seleção são tratadas, "0" é considerado falso para caixas de seleção e campos booleanos, mas é um valor verdadeiro em Ruby.Portanto, não podemos simplesmente verificar se force_reversion não é avaliado como falso.

def needs_version?
  !(versioned_columns & changed).empty? || 
    ![nil, "0", 0, false].include?(force_reversion)
end

E está tudo pronto.Basta passar qualquer valor para force_reversion como se fosse uma coluna.

Após as alterações acima com o seguinte modelo:

classe Usuário

@user.update_attributes(:force_reversion => true, :unversioned_column => new_value)

Ou em um formato:

<%= form_for @user do |f| %>
  <%= f.label :force_reversion, "Force New Version" %>
  <%= f.check_box :force_reversion %>
  ... More fields ...
<% end %>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top