Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 渲染局部对象时自动调用控制器方法_Ruby On Rails_Ruby On Rails 3.2 - Fatal编程技术网

Ruby on rails 渲染局部对象时自动调用控制器方法

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

我有一个部分,需要有一些控制器逻辑运行之前,它可以渲染没有问题。是否有某种方法将分部与渲染时运行的某些控制器逻辑相关联

例如,我当前的代码就是这样的:

MyDataController:

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中分配给一个实例变量(然后迭代),这不是标准做法。我不会这么做,根据其他拒绝建议编辑的海报,我认为可能最好像我在代码中所做的那样,采用更为简略、直接的方法。我再次提交编辑时看到了你的评论。关于您的代码示例,我关心的一件小事是您创建了散列,但是您从来没有使用它来查找键值对。当然,我明白你的意思——把所有的逻辑都转移到助手身上。啊,在这种情况下,你的建议是有道理的。我接受了编辑。