Многоразовый слим с параметрами?

У меня есть частичная дата следующим образом, которая на данный момент жестко запрограммирована:

#postdate
  .grid
    .grid__cell.day 15th
    .grid__cell.month Jan
    .grid__cell.year 2015

Однако есть ли способ сделать это многоразовым, сделав дату динамической, чтобы я мог передать дату из другого тонкого файла?

Я не уверен, как это сделать, поскольку вы визуализируете частичное, просто добавляя == slim :'components/_date'. Есть ли лучший способ сделать это вообще?

Я использую Ruby с sass и sinatra.

Спасибо!


person liloka    schedule 18.01.2015    source источник


Ответы (2)


... есть ли способ сделать это многоразовым, сделав дату динамической, чтобы я мог передать дату...

В маршруте Sinatra вы можете установить переменные, которые доступны в ваших тонких шаблонах:

маршруты.rb:

require 'sinatra'
require 'slim'

get '/' do
  @day = 170000   #****HERE****
  slim :index
end

просмотры/index.slim:

h2 This is views/index.slim:

div The day is: #{@day}  #****HERE****

ul.fruit
  li Apples
  li Oranges


== slim :'components/_date'

просмотры/компоненты/_date.slim:

#postdate
  .grid
    .grid__cell.day  =@day  #****HERE*****
    .grid__cell.month Jan
    .grid__cell.year 2015

Я не очень понимаю, что вы имеете в виду:

передать дату из другого тонкого файла

Можете ли вы привести пример того, что вы хотите сделать?

Ответ на комментарий:

Согласно часто задаваемым вопросам о Sinatra, Как визуализировать частичные фрагменты?, если вы хотите визуализировать частичное и указать локальные переменные для частичного, вам необходимо установить гем:

$ gem install sinatra-partial

Вот пример приложения:

~/sinatra_projects$ tree slim_app/

slim_app/
├── models
├── public
│   ├── cool_stuff.html
│   └── imgs
├── routes.rb
└── views
    ├── components
    │   └── _date.slim
    ├── index.slim
    └── layout.slim

маршруты.rb:

require 'sinatra'
require 'slim'

#***NEW STUFF:
require 'sinatra/partial' 
set :partial_template_engine, :slim  
enable :partial_underscores

get '/' do
  slim :index
end

просмотры/компоненты/index.slim:

h2 This is views/index.slim:

ul.fruit
  li Apples
  li Oranges


== partial\
  :'components/date', 
  locals: {day: 1, month: 'Jan', year: 2015}

== partial\
  :'components/date', 
  locals: {day: 25, month: 'Dec', year: 2014}

Если вы используете различные виды шаблонов, erb, haml, slim и т. д., вы можете установить тип при вызове partial():

partial(:"components/date", :template_engine => :slim, :locals => {...})

просмотры/компоненты/_date.slim:

#postdate
  .grid
    .grid__cell.day  =day
    .grid__cell.month =month
    .grid__cell.year =year 

просмотры/layout.slim:

doctype html 
html
  head 
    meta charset="utf-8"
    title Test
  body 
    h1 This is the Layout.  Find me in /views/app_layout.slim
    == yield 

Итак, я предполагаю, что вы хотите сделать что-то вроде этого:

маршруты.rb:

get '/' do

  @dates = [
    {day: 1, month: 'Jan', year: 2015},
    {day: 2, month: 'Feb', year: 2015},
    {day: 3, month: 'Mar', year: 2015},
    {day: 4, month: 'Apr', year: 2015},
  ]

  slim :index

end

просмотры/index.slim:

h2 This is views/index.slim:

ul.fruit
  li Apples
  li Oranges

- @dates.each do |date|
  == partial\
    :'components/date', 
    locals: {day: date[:day], month: date[:month], year: date[:year]}

просмотры/компоненты/_date.slim:

#postdate
  .grid
    .grid__cell.day  =day
    .grid__cell.month =month
    .grid__cell.year =year 

...который производит:

Это Макет. Найдите меня в /views/app_layout.slim

Это просмотры/index.slim:

  • яблоки
  • Апельсины

1
янв
2015
2
февраль
2015
3
март
2015
4
апрель
2015

person 7stud    schedule 18.01.2015
comment
Я имею в виду, что когда я вызываю ==slim :'components/_date', я могу передать даты. Итак, мой сценарий заключается в том, что у меня есть список жестко закодированных дат для портфолио, где я устанавливаю свои даты. - person liloka; 19.01.2015
comment
Итак, мой сценарий таков: у меня есть список жестко заданных дат для портфолио. Так почему же вы не можете жестко закодировать их в своем маршруте? Предположим, вы могли бы написать: ==slim :'components_date'('hello', 'world') Какие преимущества это даст по сравнению с записью тех же значений в маршруте? - person 7stud; 19.01.2015
comment
Преимущество состоит в том, чтобы отображать партиал с переданными датами, а не повторять код в партиале с разными датами. Я не думаю, что очень хорошо объясняю себя. - person liloka; 19.01.2015
comment
@liloka, посмотри внизу моего ответа. - person 7stud; 20.01.2015

У меня была похожая проблема, и мне удалось написать хелпер для партиалов, который дает вам функциональность партиалов, подобную Rails. Я очень доволен этим!

#partials_helper.rb
module PartialsHelper
  def partial(name, path: '/partials', locals: {})
    Slim::Template.new("#{settings.views}#{path}/#{name}.slim").render(self, locals)
  end
end

-

#app.rb
require 'slim'
require 'slim/include'
require 'partials_helper'
require 'other_helper_methods'

class App < Sinatra::Base
  helpers do
    include PartialsHelper
    include OtherHelperMethods
  end

  get '/' do
    slim :home
  end
end

-

#views/home.slim
== partial :_hello_world, locals: { name: 'Andrew' }

-

#views/partials/_hello_world.slim
h1 Hello, World! Hello #{name}!

Изначально у меня был только .render({}, locals), а это означало, что частичные не имели доступа ни к каким вспомогательным методам, содержащимся внутри OtherHelperMethods (но home.slim имели). Передача self в .render в качестве первого аргумента исправляет это (если вам интересно, посмотрите документацию Tilt::Template #render.

С этим PartialsHelper передача локальных переменных не является обязательной, как и указание другого пути к партиалу (относительно settings.views).

Надеюсь, вы получите от него столько же пользы, сколько и я!

person Yorkshireman    schedule 13.07.2016