Рейки: заплутаний синтаксис для передачі місцевих жителів партизалам


99

Розуміння "магії" Рейок щодо надання частки (і передачі місцевих жителів у них).

Чому це працює:

<%= render "rabbits/form" %>

І ця робота:

<%= render "rabbits/form", :parent => @warren, :flash => flash %>

але це не працює:

<%= render "rabbits/form", :locals => { :parent => @warren, :flash => flash } %>

Але це робить:

<%= render :partial =>"rabbits/form", :locals => { :parent => @warren, :flash => flash } %>

Крім того, як я можу шукати ці нюанси, щоб мені не потрібно заважати людям на SO?


3
У коментарі нижче ви говорили, що рейки api docs - це не такий пошук. Спробуйте скористатися цим сайтом: apidock.com/rails . Тут також є рубін і rspec.
ryeguy

Відповіді:


152

Коротка відповідь полягає в тому, що метод візуалізації розглядає перший аргумент, який ви передаєте. Якщо ви передаєте хеш (який включає :partial => 'foo', :locals => {blah blah blah}), він передасть усі ваші аргументи як хеш і аналізує їх відповідно.

Якщо ви передаєте рядок як ваш перший аргумент, він передбачає, що перший аргумент - це ваше часткове ім'я, а решту передасть як ваші місцеві жителі. Однак у цьому наступному дзвінку він фактично призначає :locals => your_locals_argument, що в даному випадку є цілим :locals => {locals hash}, а не просто {locals hash}; тобто ви закінчуєте :locals => {:locals => {locals hash}}, а не :locals => {locals hash}.

Тому моя порада полягає у тому, щоб весь час явно передавати значення однаково, і у вас не буде проблем. Для того, щоб дізнатися про це, я перейшов безпосередньо до самого коду ( actionpack / lib / base.rb , render()метод в Rails 2; Rails 3 відрізняється). Це гарна вправа.

Крім того, не турбуйтеся про "набриднення" людей на ПП. Ось чому цей сайт існує. Я навіть щось із цього навчився.


5

якщо вам потрібно вказати: місцеві жителі, вам потрібно вказати: частковий або: шаблон

<%= render :partial => "rabbits/form", :locals => {...} %>

повинен працювати


це стосується того, як рубін оцінює хеш, якщо вам цікаво таким чином.
sethvargo

Дійсно, це працює ... як я вказав у своєму запитанні ... але що мені цікаво, чому? і де це документально зафіксовано? тільки дивлячись на джерело? І якщо це єдиний спосіб знайти та зрозуміти ці безлічі нюансів у Rails, то мені цікаво, як і куди йти про пошук та інтерпретацію цього джерела. Я не можу просто натиснути на "візуалізувати", а потім перейти до джерела (все одно не з TextMate) або можу?
Мелтемi

1
ах! тож вам насправді цікаво :). Так, єдиний спосіб розібратися в цих речах - це a.) Мати переконання, як ви, і b.) Переглянути вихідний код. Я поняття не маю, як просвердлити джерело, хоча ... вибачте
sethvargo

гаразд, я кусаю ... як ти шукаєш подібні речі? ти просто копаєшся через своє clone https://github.com/rails/rails.git? чи є кращий спосіб? Вибачте , але я відносно новий для RoR і до сих пір не знайшов хороший / легкий / послідовний спосіб подивитися на Rails документації ... такі , що IS - або. http://api.rubyonrails.org/не легко шукати. а джерело від git - це не таке ... зітхання
Meltemi

Я не будь-який експерт, але я використовую студію Aptana. Він побудований на тій же платформі, що і eclipse (якщо ви знайомі). Це дозволяє "натискати" і простежувати так, як ви сказали. Ви також можете здійснити пошук у коді, і він має вбудований термінал і т. Д. Застереження - це досить великий файл
sethvargo

2

Будучи honost, я знаю лише про ці випадки використання, тому що я не відставав від Rails останні кілька років і читав повідомлення про те, що додано новий спосіб зробити це. Я часто сам в цьому помиляюся, але зазвичай це легко виправити.

Це одна з тих частин API Rails, яка не була ретельно продумана, якщо ви запитаєте мене. Він просто накопичував все більше і більше синтаксичного цукру з роками, не принижуючи жодної старої поведінки. Метод візуалізації має діабет.

Щоб зробити це ще гірше, візуалізація поводиться по-різному в контролері та режимі перегляду. Я також переглядаю вміст першого аргументу, щоб побачити, чи це файл, шаблон, дія чи частковість. Якщо він починається з косою рисою, то це файл чи щось подібне.

Я за те, щоб, коли це можливо, використовувати короткі позначення. Тому що короткі позначення дійсно повідомляють про наміри. Читаючи його, він зазвичай робить те, що, на вашу думку, робить. Писати партії не прямо.


1

Ось джерело методу візуалізації з http://api.rubyonrails.org/classes/ActionView/Rendering.html#method-i-render :

def render(options = {}, locals = {}, &block)
  case options
  # Here is your last case
  when Hash
    if block_given?
      _render_partial(options.merge(:partial => options.delete(:layout)), &block)
    elsif options.key?(:partial)
      _render_partial(options)
    else
      template = _determine_template(options)
      lookup_context.freeze_formats(template.formats, true)
      _render_template(template, options[:layout], options)
    end
  when :update
    update_page(&block)
  else
    # here the first three cases
    _render_partial(:partial => options, :locals => locals)
  end
end

Сподіваюся, що це допоможе!


Це допомагає , дякую! Але це не допомагає мені допомогти собі ... якщо ви знаєте, що я маю на увазі ...
Мелтемi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.