我有以下查看代码:
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
的形式返回?我似乎找不到一种方法来呈现变量,而不是将其打印为纯文本。
答案 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 }
,当然也可以使用。)