如何在控制器中呈现视图并分配给变量(Rails)

时间:2018-07-20 02:38:36

标签: ruby-on-rails ruby ruby-on-rails-5

我有以下查看代码:

app / views / calendars / try.html.erb

<%= @ow %>

然后在我的控制器中,我有以下内容:

app / controllers / calendars_controller.rb

class CalendarsController < ApplicationController
  def try
    @ow = 'hello'
  end
end

问题是,我想获取视图文件的内容并将其分配给 controller 中的变量。

类似于myvar = content_of_my_view然后myvar的事物将返回hello

有可能这样做吗?

我尝试了以下方法:

测试1:

class CalendarsController < ApplicationController
  def try
    @ow = 'hello'

    html = open(Rails.root.join('app','views','calendars','try.html.erb')).read

    raise html.inspect
  end
end

这将以纯文本形式返回<%= @ow %>,而不是我想要的hello

测试2:

class CalendarsController < ApplicationController
  def try
    @ow = 'hello'

    html = open(File.join('app','views','calendars','try.html.erb')).read

    raise html.inspect
  end
end

测试1 中的输出相同。

测试3:

class CalendarsController < ApplicationController
  def try
    @ow = 'hello'

    html = open(Rails.root.join('app','views','calendars','try.html.erb'), 'rb') {|io| a = a + io.read}

    raise html.inspect
  end
end

测试1 测试2 中的输出相同。

测试4:

class CalendarsController < ApplicationController
  def try
    @ow = 'hello'

     html = IO.binread(Rails.root.join('app','views','calendars','try.html.erb'))

    raise html.inspect
  end
end

测试1 测试2 测试3 中的输出相同。

测试5:

class CalendarsController < ApplicationController
  def try
    @ow = 'hello'

     html = render('o')

    raise html.inspect
  end
end

这将不返回任何内容。

是否可以从控制器以hello的形式返回?我似乎找不到一种方法来呈现变量,而不是将其打印为纯文本。

2 个答案:

答案 0 :(得分:3)

您可以使用render_to_string来呈现ERB模板并以字符串形式返回其内容。

答案 1 :(得分:2)

在Rails 5中最友好的方法是使用ActionController::Renderer API

class CalendarsController < ApplicationController
  def try
    html = CalendarsController.render(
      template: "calendars/try.html.erb",
      assigns: {
        ow: "hello",
      },
    )
  end
end

请注意,它构建了一个单独的控制器实例,因此它无权访问您的本地实例变量:它们必须改为以assigns的形式显式传递。 (尽管如果您在两个地方都需要使用{ ow: @ow },当然也可以使用。)