Ruby on rails 渲染局部对象时自动调用控制器方法
我有一个部分,需要有一些控制器逻辑运行之前,它可以渲染没有问题。是否有某种方法将分部与渲染时运行的某些控制器逻辑相关联 例如,我当前的代码就是这样的: MyDataController:Ruby on rails 渲染局部对象时自动调用控制器方法,ruby-on-rails,ruby-on-rails-3.2,Ruby On Rails,Ruby On Rails 3.2,我有一个部分,需要有一些控制器逻辑运行之前,它可以渲染没有问题。是否有某种方法将分部与渲染时运行的某些控制器逻辑相关联 例如,我当前的代码就是这样的: MyDataController: class MyDataController < ApplicationController def view @obj = MyData.find(params[:id]) run_logic_for_partial end def some_method_i_dont_k
class MyDataController < ApplicationController
def view
@obj = MyData.find(params[:id])
run_logic_for_partial
end
def some_method_i_dont_know_about
@obj = MyData.find(params[:id])
# Doesn't call run_logic_for_partial
end
def run_logic_for_partial
@important_hash = {}
for item in @obj.internal_array
@important_hash[item] = "Important value"
end
end
end
class MyDataController
view.html.erb:
Name: <%= @obj.name %>
Date: <%= @obj.date %>
<%= render :partial => "my_partial" %>
Name: <%= @obj.name %>
User: <%= @obj.user %>
<%# This will fail because @important_hash isn't initialized %>
<%= render :partial => "my_partial" %>
<% for item in @obj.internal_array %>
<%= item.to_s %>: <%= @important_hash[item] %>
<% end %>
名称:
日期:
“我的部分”%>
关于.html.erb的一些方法我不知道:
Name: <%= @obj.name %>
Date: <%= @obj.date %>
<%= render :partial => "my_partial" %>
Name: <%= @obj.name %>
User: <%= @obj.user %>
<%# This will fail because @important_hash isn't initialized %>
<%= render :partial => "my_partial" %>
<% for item in @obj.internal_array %>
<%= item.to_s %>: <%= @important_hash[item] %>
<% end %>
名称:
用户:
您试图做的事情与Rails控制器/视图的设计使用方式背道而驰。最好是结构上有所不同。为什么不将为_partial
运行_logic_放入助手中,并使其接受一个参数(而不是隐式处理@obj
)
要查看视图“helper”的示例,请查看此处:您尝试执行的操作与Rails控制器/视图的设计使用方式背道而驰。最好是结构上有所不同。为什么不将为_partial
运行_logic_放入助手中,并使其接受一个参数(而不是隐式处理@obj
)
要查看视图“帮助器”的示例,请查看此处:对于这种逻辑,您应该使用视图帮助器。如果您使用rails generate
生成资源,则资源的帮助文件应该已经在app/helpers
目录中。否则,您可以自己创建它:
# app/helpers/my_data.rb
module MyDataHelper
def run_logic_for_partial(obj)
important_hash = {}
for item in obj.internal_array
important_hash[item] = "Important value" // you'll need to modify this keying to suit your purposes
end
important_hash
end
end
然后,在局部视图中,将要操作的对象传递给助手:
# _my_partial.html.erb
<% important_hash = run_logic_for_partial(@obj) %>
<% for item in important_hash %>
<%= item.to_s %>: <%= important_hash[item] %>
<% end %>
然后,您将以以下方式在您的部分应用程序中访问重要\u散列
属性:
# _my_partial.html.erb
<% for item in @obj.important_hash %>
<%= item.to_s %>: <%= item %>
<% end %>
#u my_partial.html.erb
:
对于这种逻辑,您应该使用视图帮助器。如果您使用rails generate
生成资源,则资源的帮助文件应该已经在app/helpers
目录中。否则,您可以自己创建它:
# app/helpers/my_data.rb
module MyDataHelper
def run_logic_for_partial(obj)
important_hash = {}
for item in obj.internal_array
important_hash[item] = "Important value" // you'll need to modify this keying to suit your purposes
end
important_hash
end
end
然后,在局部视图中,将要操作的对象传递给助手:
# _my_partial.html.erb
<% important_hash = run_logic_for_partial(@obj) %>
<% for item in important_hash %>
<%= item.to_s %>: <%= important_hash[item] %>
<% end %>
然后,您将以以下方式在您的部分应用程序中访问重要\u散列
属性:
# _my_partial.html.erb
<% for item in @obj.important_hash %>
<%= item.to_s %>: <%= item %>
<% end %>
#u my_partial.html.erb
:
make为什么不将重要的哈希推送到模型中?make为什么不将重要的哈希推送到模型中?我对Rails非常陌生。你可以发布一个例子来说明我是如何做到这一点的吗?在这种情况下,我建议你参考我刚刚添加了链接的Rails指南。我对Rails非常陌生。你能举个例子说明我是如何做到这一点的吗?在这种情况下,我建议你参考我刚刚添加了链接的Rails指南。我明白你的意思了。我做了一些编辑,我想这会让你的方法更清晰一些。它们看起来对吗?它们是有意义的,尽管它们与我最初的代码没有本质上的不同。需要指出的一点是:您建议将@obj.important\u hash
从您的view-partial中分配给一个实例变量(然后迭代),这不是标准做法。我不会这么做,根据其他拒绝建议编辑的海报,我认为可能最好像我在代码中所做的那样,采用更为简略、直接的方法。我再次提交编辑时看到了你的评论。关于您的代码示例,我关心的一件小事是您创建了散列,但是您从来没有使用它来查找键值对。当然,我明白你的意思——把所有的逻辑都转移到助手身上。啊,在这种情况下,你的建议是有道理的。我接受了编辑,我明白你的意思。我做了一些编辑,我想这会让你的方法更清晰一些。它们看起来对吗?它们是有意义的,尽管它们与我最初的代码没有本质上的不同。需要指出的一点是:您建议将@obj.important\u hash
从您的view-partial中分配给一个实例变量(然后迭代),这不是标准做法。我不会这么做,根据其他拒绝建议编辑的海报,我认为可能最好像我在代码中所做的那样,采用更为简略、直接的方法。我再次提交编辑时看到了你的评论。关于您的代码示例,我关心的一件小事是您创建了散列,但是您从来没有使用它来查找键值对。当然,我明白你的意思——把所有的逻辑都转移到助手身上。啊,在这种情况下,你的建议是有道理的。我接受了编辑。