3

特定のルート/ページの場合にのみメッセージを表示したいと思います。基本的に、/route の場合はメッセージを表示します。

Sinatra Docs を調べてみましたが、具体的な方法が見つかりません。これを機能させるRubyメソッドはありますか?

編集:これは私がやりたいことの例です。

get '/' do
    erb :index
end

get '/page1' do
    erb :page1
end

get '/page2' do
    erb :page2
end

*******************

<!-- Layout File -->
<html>
<head>
    <title></title>
</head> 
<body>
    <% if this page is 'page1' do something %>
    <% else do something else %>
    <% end %>

    <%= yield %>
</body>
</html>

Ruby/Sinatra を使用して現在のページをターゲットにし、if ステートメントに構造化する方法がわかりません。

4

2 に答える 2

3

これにアプローチするにはいくつかの方法があります (ところで、 ERB を使用したことがありますが、Hamlを使用するつもりです。これは、私にとってタイピングが少なく、明らかに改善されているためです)。それらのほとんどはrequest ヘルパーに依存しており、ほとんどの場合はrequest.path_info.

ビュー内の条件付き。

レイアウトだけでなく、任意のビュー内で:

%p
  - if request.path_info == "/page1"
    = "You are on page1"
  - else
    = "You are not on page1, but on #{request.path_info[1..]}"
%p= request.path_info == "/page1" ? "PAGE1!!!" : "NOT PAGE1!!!"

ルート付きの条件。

get "/page1" do
  # you are on page1
  message = "This is page 1"
  # you can use an instance variable if you want, 
  # but reducing scope is a best practice and very easy.
  erb :page1, :locals => { message: message }
end

get "/page2" do
  message = nil # not needed, but this is a silly example
  erb :page2, :locals => { message: message }
end

get %r{/page(\d+)} do |digits|
  # you'd never reach this with a 1 as the digit, but again, this is an example
  message = "Page 1" if digits == "1"
  erb :page_any, :locals => { message: message }
end

# page1.erb
%p= message unless message.nil?

beforeブロック。

before do
  @message = "Page1" if request.path_info == "/page1"
end

# page1.erb
%p= @message unless @message.nil?

またはさらに良い

before "/page1" do
  @message = "Hello, this is page 1"
end

またはそれ以上

before do
  @message = request.path_info == "/page1" ? "PAGE 1!" : "NOT PAGE 1!!"
end

# page1.erb
%p= @message

また、これを行う場合は、 Sinatra Partialを参照することをお勧めします。これは、ジョブ用に作成されたヘルパーがあれば、ビューの分割を処理する方がはるかに簡単だからです。

于 2012-12-29T19:20:06.510 に答える
1

Sinatraには「controller#action」Railのような概念がないため、現在のルートをインスタンス化する方法は見つかりません。いずれにせよ、あなたは現在のルートが何であるかについての相対的な考えrequest.path.split('/').lastを得るためにチェックすることができます。

ただし、何かをそのように表示したい場合if request.path == "x"は、そのコンテンツをレイアウト内の別の場所にレンダリングする必要がない限り、そのコンテンツをテンプレートに配置することをお勧めします。その場合、Railのようなものを使用できますcontent_forsinatra-content-forを確認してください。

于 2012-12-29T17:49:55.643 に答える