可重复使用的超薄参数?

时间:2015-01-18 00:35:56

标签: css ruby sinatra slim-lang

我的日期部分如下,目前是硬编码的:

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

但是,有没有办法通过使日期动态来使这个可重用,以便我可以从另一个苗条文件传递日期?

我不确定如何解决此问题,因为您只需添加== slim :'components/_date'即可渲染部分内容。是否有更好的办法完全做这种事情?

我使用Ruby和sass和sinatra。

谢谢!

2 个答案:

答案 0 :(得分:1)

  

...有没有办法通过使日期动态化来使这个可重用   我可以通过日期......

在sinatra路线中,您可以设置变量,这些变量可在您的超薄模板中访问:

routes.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 faq,How do I render partials?,如果要渲染部分并为partial指定局部变量,则需要安装gem:

$ 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

routes.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 

所以,我假设你想做这样的事情:

routes.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找到我

这是views / index.slim:

  • 苹果
  • 橘子

1

2015年
2
二月
2015年
3
三月
2015年
4
四月
2015年

答案 1 :(得分:0)

我遇到了类似的问题并设法编写了一个杀手部分助手,它可以为你提供类似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,传递locals是可选的,因为指定部分的不同路径(相对于settings.views)。

希望你像我一样尽可能多地使用它!