File: logic_less.md

package info (click to toggle)
ruby-slim 5.2.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 828 kB
  • sloc: ruby: 5,583; makefile: 12
file content (137 lines) | stat: -rw-r--r-- 4,961 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# ロジックレスモード

ロジックレスモードは [Mustache](https://github.com/defunkt/mustache) にインスパイアされています。ロジックレスモードは
例えば動的コンテンツを含む再帰的ハッシュツリーのような辞書オブジェクトを使います。

## 条件付き

オブジェクトが false または empty? ではない場合, コンテンツが表示されます。

    - article
      h1 = title

## 反転条件付き

オブジェクトが false または empty? の場合, コンテンツが表示されます。

    -! article
      p Sorry, article not found

## 繰り返し

オブジェクトが配列の場合, この部分は繰り返されます。

    - articles
      tr: td = title

## ラムダ式

Mustache のように, Slim はラムダ式をサポートします。

    = person
      = name

ラムダ式は次のように定義できます:

    def lambda_method
      "<div class='person'>#{yield(name: 'Andrew')}</div>"
    end

任意に 1 つ以上のハッシュを `yield` に渡すことができます。複数のハッシュを渡した場合, 先述したようにブロックが繰り返されます。

## 辞書アクセス

サンプルコード:

    - article
      h1 = title

辞書オブジェクトは `:dictionary_access` オプションによって設定された順序でアクセスされます。デフォルトの順序:

1. `シンボル` - `article.respond_to?(:has_key?)` 且つ `article.has_key?(:title)` の場合, Slim は `article[:title]` を実行します。
2. `文字列` - `article.respond_to?(:has_key?)` 且つ `article.has_key?('title')` の場合, Slim は `article['title']` を実行します。
3. `メソッド` - `article.respond_to?(:title)` の場合, Slim は `article.send(:title)` を実行します。
4. `インスタンス変数` - `article.instance_variable_defined?(@title)` の場合, Slim は `article.instance_variable_get @title` を実行します。

すべて失敗した場合, Slim は親オブジェクトに対して同じ順序で title の参照を解決しようとします。この例では, 親オブジェクトはレンダリングしているテンプレートに対する辞書オブジェクトになります。

ご想像のとおり, article への参照は辞書オブジェクトに対して同じ手順で行われます。インスタンス変数はビューのコードでは利用を許されていませんが, Slim はそれを見つけて使います。基本的には, テンプレートの中で @ プレフィックスを落として使っています。パラメータ付きメソッドの呼び出しは許可されません。


## 文字列

`self` キーワードは検討中の要素を `.to_s` した値を返します。

辞書オブジェクトを与え,

    {
      article: [
        'Article 1',
        'Article 2'
      ]
    }

ビューで次のように

    - article
      tr: td = self

これは次のようになります。

    <tr>
      <td>Article 1</td>
    </>
    <tr>
      <td>Article 2</td>
    </tr>


## Rails でロジックレスモード

インストール:

    $ gem install slim

require で指定:

    gem 'slim', require: 'slim/logic_less'

特定のアクションでのみロジックレスモードを有効化したい場合, まず設定でロジックレスモードを global に無効化します。

    Slim::Engine.set_options logic_less: false

さらに, アクションの中でレンダリングする度にロジックレスモードを有効化します。

    class Controller
      def action
        Slim::Engine.with_options(logic_less: true) do
          render
        end
      end
    end

## Sinatra でロジックレスモード

Sinatra には Slim のビルトインサポートがあります。しなければならないのはロジックレス Slim プラグインを require することです。config.ru で require できます:

    require 'slim/logic_less'

これで準備は整いました!

特定のアクションでのみロジックレスモードを有効化したい場合, まず設定でロジックレスモードを global に無効化します。

    Slim::Engine.set_options logic_less: false

さらに, アクションの中でレンダリングする度にロジックレスモードを有効化します。

    get '/page'
      slim :page, logic_less: true
    end

## オプション

| 種類 | 名前 | デフォルト | 用途 |
| ---- | ---- | ------- | ------- |
| 真偽値 | :logic_less | true | ロジックレスモードを有効化 ('slim/logic_less' の required が必要) |
| 文字列 | :dictionary | "self" | 変数が検索される辞書への参照 |
| シンボル/配列&lt;シンボル&gt; | :dictionary_access | [:symbol, :string, :method, :instance_variable] | 辞書のアクセス順序 (:symbol, :string, :method, :instance_variable) |