Jak zmienić pliki Railsa?

witam. Takie pytanie

chce zmienić plik vendor/rails/actionpack/lib/action_view/helpers/active_record_helper.rb

tak aby dopasować dla siebie wyświetlanie informacji o błedach walidacji. Jednak w mojej aplikacji nie ma takiego pliku!
W katalogu vendors jest tylko pusty folder plugin

Wersja rails: 1.2.2

Czy powinienem utworzyć taki plik?

[quote=br-design.pl]chce zmienić plik vendor/rails/actionpack/lib/action_view/helpers/active_record_helper.rb
tak aby dopasować dla siebie wyświetlanie informacji o błedach walidacji.[/quote]
Ale po co strzelać z armat do komarów? Przejrzyj dokumentację walidatorów i listę parametrów. Znajdziesz coś takiego jak message. (Przykład z API)

class Person < ActiveRecord::Base validates_length_of :first_name, :maximum=>30 validates_length_of :last_name, :maximum=>30, :message=>"less than %d if you don't mind" validates_length_of :fax, :in => 7..32, :allow_nil => true validates_length_of :user_name, :within => 6..20, :too_long => "pick a shorter name", :too_short => "pick a longer name" validates_length_of :fav_bra_size, :minimum=>1, :too_short=>"please enter at least %d character" validates_length_of :smurf_leader, :is=>4, :message=>"papa is spelled with %d characters... don't play me." end

Nie, nie to wiem, ale mi wchodzi o ten error główny np.

“2 errors prohibited story from being save” :wink:

Zgodnie z API trzeba zmienić powyższy plik.

Ok, sry. Źle Cię zrozumiałem.

w moim przypadku plik znajduje sie w katalogu:
/usr/lib/ruby/gems/1.8/gems/actionpack-1.13.2/lib/action_view/helpers/

wystarczy skopiować go do katalogu zgodnego z tym co podaje API:
vendor/rails/actionpack/lib/action_view/helpers/active_record_helper.rb

Wtedy aplikacja pobierze “lokalną” dla siebie wersje.

Powodzenia

Niestety, kiedy skopiuje ten plik do scieżki odpowiedniej to serwer przy starcie wypluwa mi coś takiego:

./script/…/config/boot.rb:16:in require': No such file to load -- script/../config/../vendor/rails/railties/lib/initializer (LoadError) from ./script/../config/boot.rb:16 from script/server:2:inrequire’
from script/server:2

Po usunięciu pliki (i całej struktury) wszystko jest OK.

Ok, chyba się pogubiłem. W tym temacie posiłkowałem się następującymi:

http://wiki.rubyonrails.com/rails/pages/HowToLocalizeActiveRecordErrors
http://wiki.rubyonrails.org/rails/pages/OverridingRailsMessagesInAnotherLanguage

Mam nadzieję, że jakoś Ci to pomoże.

Niestety, te zmienne nie obejmują tego komunikatu:

“1 error prohibited this story from being saved”

Jest on zdefiniowany w tym pliku: vendor/rails/actionpack/lib/action_view/helpers/active_record_helper.rb

Ale niestety nie wiem jak by napisać, tak czy siak dzięki Marcinie za pomoc, mimo wszystko coś się dowiedzialem :wink:

Ja osobiście nie lubię podmieniać plików z vendor/rails, bo później przy ewentualnej aktualizacji trzeba pamiętać o zmianach.

Najłatwiej skorzystać z otwartych klas w rubim. Czyli tworzysz sobie w katalogu lib plik, w którym podmieniasz metody, które chcesz zmodyfikować na własne i później dajesz require ‘plik’ w application.rb na przykład (albo jak potrzebujesz tego tylko w jednym kontrolerze, to właśnie w nim).

[quote=Marcin][quote=br-design.pl]chce zmienić plik vendor/rails/actionpack/lib/action_view/helpers/active_record_helper.rb
tak aby dopasować dla siebie wyświetlanie informacji o błedach walidacji.[/quote]
Ale po co strzelać z armat do komarów? Przejrzyj dokumentację walidatorów i listę parametrów. Znajdziesz coś takiego jak message. (Przykład z API)[/quote]
DRY ? :slight_smile:

A to co chce zrobic autor, mozna wykonac poprzez plugin.

szybki tutorial (pisany z pamieci):

./script/generate plugin new_errors
w
vendor/plugins/new_errors/lib/new_errors.rb

module ActiveRecord
  class Errors
    @@default_error_messages.update({
      :not_a_number => "- pole nie jest liczbą",
      :blank => "- pole nie moze byc puste"
      # tu reszta pol z @@default_error_messages
    })
  end
end

module ActionView #nodoc
  module Helpers
    module ActiveRecordHelper
      def error_messages_for(object_name, options = {})
        options = options.symbolize_keys
        object = instance_variable_get("@#{object_name}")
        unless object.errors.empty?
          content_tag("div",
            content_tag(
              options[:header_tag] || "h2",
              "Wystąpił błąd podczas przetwarzania Twojego żądania"
            ) +
            content_tag("p", "Wystąpiły następujące błędy:") +
            content_tag("ul", object.errors.full_messages.collect { |msg| content_tag("li", msg) }),
            "id" => options[:id] || "errorExplanation", "class" => options[:class] || "errorExplanation"
          )
        end
      end
    end
  end
end

To ile razy Ty definiujesz model X w ramach jednej aplikacji? Ja jestem takim dziwnym gościem, który daną klasę definuje raz i w jednym miejscu… Wybaczcie, wiem, trochę to WET.

[code]A to co chce zrobic autor, mozna wykonac poprzez plugin.

szybki tutorial (pisany z pamieci):

./script/generate plugin new_errors
w
vendor/plugins/new_errors/lib/new_errors.rb[/code]
Oho, nie doszedłem jeszcze do pluginów :wink: Ale widocznie można. to dobre rozwiązanie?

Ja tam nie lubie w kazdym modelu wpisywac validates_presence_of :pole, :message => “nie moze byc puste”
A co to jest WET ?:slight_smile:

No tak, ale czasami chcesz napisać Hasło nie może być puste, a czasami Proszę o uzupełnienie hasła. To daje Ci taką możliwość. Osobiście uważam, że jest to wygodne, daje swobodę językową, odmiany, końcówki, zwłaszcza przy języku polskim jest to istotne. A mimo wszystko pozostaje w duchu DRY.

WET = !DRY
:smiley:

Tak w ogóle jeśli chodzi o to, żeby na szybko zmienić anglojęzyczne komunikaty pochodzące ze scaffoldingu, to najszybciej można tym: http://agilewebdevelopment.com/plugins/localization_simplified. Polskie stringi popełniłem jakiś czas temu, http://homepage.mac.com/komor/iblog/B1412381085/C1090518654/E20061219154823/index.html ale coś nie mam siły wysłać do autora. Nie jest to full-profi rozwiązanie, jest też parę rzeczy do skończenia (polska odmiana!), ale zawsze coś.
Jak kolega br-design.pl chce popróbować, to zapraszam. Ja używam tego w swojej aplikacji i działa.

cholera wcześniej komor nie mogłeś… :stuck_out_tongue: też trochę potłumaczyłem już ten plugin … ale masz więcej, więc potestuje w wolnej chwili Twój…

pozdrawiam

niezły kozak z ciebie

@Komor:
O może być przydatne! :wink:
I ten plugin zmienia ten komunikat o errorach walidacji?

Pobawiłem się z tym pluginem i mam nie mały problem, czy on przypadkiem nie zmienia zasad odmieniania nazw modeli z liczby pojedyńczej na mnogą?

Otóż zrobiłem sobie zwykły test, wgrałem plugina stwrozylem model “Subpage”, dodałem funkcje scaffold :subpage w kontrolerze CMS, i dodając nowy wpis, dostaję taki error:

[code] Showing app/views/cms/_form.rhtml where line #11 raised:

wrong number of arguments (0 for 1)

Extracted source (around line #11):

8: <%= text_area ‘subpage’, ‘body’ %>


9:
10:

Created at

11: <%= datetime_select ‘subpage’, ‘created_at’ %>


12:
13:[/code]
Trace:

vendor/plugins/l10n-simplified/lib/localization_simplified.rb:163:in `value' vendor/plugins/l10n-simplified/lib/localization_simplified.rb:163:in `to_datetime_select_tag' /usr/local/lib/ruby/gems/1.8/gems/actionpack-1.13.2/lib/action_view/helpers/date_helper.rb:132:in `orig_datetime_select' vendor/plugins/l10n-simplified/lib/localization_simplified.rb:150:in `datetime_select' #{RAILS_ROOT}/app/views/cms/_form.rhtml:11:in `_run_rhtml_47app47views47cms47_form46rhtml' #{RAILS_ROOT}/app/views/cms/new.rhtml:4:in `_run_rhtml_47app47views47cms47new46rhtml' #{RAILS_ROOT}/app/views/cms/new.rhtml:3:in `_run_rhtml_47app47views47cms47new46rhtml'