0

私たちがやろうとしているのは、erbコードのチャンクを a に格納し、そのコードを erbstringでレンダリングすることです。run time

文字列として格納されている erb コードのチャンクを次に示します。

<tr>
      <th>#</th>
      <th><%= t('Date') %></th>
      <th><%= t('Project Name') %></th>
      <th><%= t('Task Name') %></th>
      <th><%= t('Log') %></th>
      <th><%= t('Entered By') %></th>

    </tr>

    <% @logs.each do |r| %>
        <tr>
          <td><%= r.id %></td>
          <td><%= (r.created_at + 8.hours).strftime("%Y/%m/%d")%></td>
          <td><%= prt(r, 'task.project.name') %></td>
          <td><%= prt(r, 'task.task_template.task_definition.name') %></td>
          <td><%= prt(r, :log) %></td>
          <td><%= prt(r, 'last_updated_by.name') %></td>

        </tr>
    <% end %>

t() は国際化のための翻訳メソッドです。

文字列に格納された上記の erb コードを以下の erb ファイルに挿入して (疑似コードで) レンダリングするにはどうすればよいでしょうか?

  <table class="table table-striped">
    <% erb_code = retrieve(chunk_of_erb_code)%>
    <% erb_code here for rendering %>

  </table>

問題の解決策はありますか? 手伝ってくれてありがとう。

アップデート:

作業コードrender inline(kamesh による):

<% erb_code = find_config_const('task_log_view', 'projectx')%>
<%= render inline: ERB.new(erb_code).result(binding) %>

良い方法として、変数 erb_code をコントローラーに移動できます。

4

4 に答える 4

3

私はあなたの質問を得たと思います。ビューで使用して、erb に任意の html 文字列を追加できます。

<%= render inline:"<p>new Field</p>"%>

また

<%= render inline: "<% products.each do |p| %><p><%= p.name %></p><% end %>" %>

またはコントローラーで:

render inline: "<% products.each do |p| %><p><%= p.name %></p><% end %>"

任意の _xyz.html.erb または xyz.html.erb に記述でき、コントローラーからも使用できます。詳細については、次のリンクを確認してください。サブトピック内 - 2.2.6 :inline で render を使用する。 レールガイド

私はこれの動作を確認しました。問題が発生した場合はお知らせください。

于 2013-08-08T07:57:24.987 に答える
1

(元の回答をかなり単純化できました。)

次のようなアプリケーション ヘルパーを作成できます。

ヘルパー/application_helper.rb:

module ApplicationHelper

  def my_erb_converter(template)
    erb = ERB.new(template)
    erb.result
  end

  def t(str)
    "***#{str}***"
  end

end

次に、アクションで次のことを行います。

include ApplicationHelper

class SomeController < ApplicationController
  ...
  ...
  def some_action
    @html = my_erb_converter("<div><%= t('hello') %></div>")
    ...
  end

次に、あなたの見解で:

<table class="table table-striped">
    <%= raw @html %>
</table>

これも私にとってはうまくいきます:

module ApplicationHelper

  def convert_erb(template)
    erb = ERB.new(template)
    erb.result
  end

  def t(str)
    "***#{str}***"
  end

  def get_erb
    "<div><%= t('hello') %></div>"
  end
end

意見:

<table class="table table-striped">
    <%= raw convert_erb(get_erb) %>
</table>
于 2013-08-08T00:57:55.937 に答える
1

あなたが要求している解決策は複雑で紛らわしいので、あなたは間違いなくパーシャルまたはヘルパーでそれをやりたいと思っています.

しかし、このソリューションを本当に実装する必要がある場合は、.html.erb.erb ファイルを作成する必要があり、erb によって 2 回解釈されます。

次のヘルパーが与えられた場合

def print_one
  "1"
end

def print_a_method
  "<%= print_one %>"
end

1を渡すと、RoR は html.erb.erb ファイルを解釈します。元は次のようになります。

<%= "<%=" %> print_one.to_i + print_one.to_i <%= "%>" %>

<%= print_a_method %>

<%= 5 + 3 %>

最初の行のトリックは、「2 番目のパスの erb タグを生成する」ことです。これは<%= "<%=" %>andに<%= "%>" %>なり<%=%>最初の行の残りはパス 1 では解釈されません。

一方、2 行目はこのパスで完全に解釈され、出力はprint_a_methodファイルに配置され、2 番目のパスで解釈されます。

3 行目も同様に解釈され、その結果が出力されます。

パス 2では、RoR は .html.erb ファイルである最初のパスの結果を受け取ります。内部的には、このようになります

# As you can seem the erb tags was generated, and now the erb code is ready for pass 2
<%= print_one.to_i + print_one.to_i %>

# The second line was interpreted and its result is erb code that will be interpreted during pass 2
<%= print_one %>

# the third line was interpreted and give the following output
8

最終的なレンダリングは、パス 2 からのファイルが解釈される .html ファイルであり、次のようになります。

2

1

8
于 2013-08-08T00:25:21.813 に答える