【问题标题】:Dynamic rendering of partials in Rails 3Rails 3 中的局部动态渲染
【发布时间】:2013-03-07 22:18:55
【问题描述】:

在我正在开发的应用程序中,我在模型中定义了一个方法task_types

task.rb
  def self.task_types
["ad_hoc"]
  end

我使用task_types 填充下拉菜单,但我也想使用它来动态呈现部分。

我想到的是,对于每种任务类型,都会有一个相关的评论框。我继续制作了一个助手,它将根据选择的任务类型调用正确的部分:

#tasks_helper.rb
module TasksHelper

  def completion_comment(task)
    task_types = @task.task_type
    render :partial => "#{Task.task_types}", :locals => {:task => task}
  end
end

不幸的是,当我调用completion_comment 时,我收到了错误消息"The partial name (["ad_hoc"]) is not a valid Ruby identifier."

我正在寻找的是一种动态的方式来呈现适当的部分。我认为我在正确的轨道上,但我不确定如何从我的 task_types 方法中提取数组元素(正如您在错误消息中看到的那样,括号和引号被拉入渲染操作)。或者,也许我需要使用不同的方法来动态渲染部分。任何帮助表示赞赏。

【问题讨论】:

  • 如果字符串有效,可能是一个符号?尝试:ad_hoc 而不是"ad_hoc"。还是拥有一个字符串对象很重要? ...哦,我明白了:我认为问题出在数组...:-/
  • 同样的问题(部分名称 ([:ad_hoc]) 不是有效的 Ruby 标识符)...我想知道我的 task_types 定义中是否有可以调用的方法,或者我有什么方法当我尝试渲染部分时要做的事情。
  • 数组不能被接受为部分名称。
  • @ValeryKvon - 是的,这就是我遇到的问题......我想传递数组的元素,而不是数组本身,但我不确定我应该如何进行。如果我必须改进我的整个方法,那很好。
  • 什么意思:传递数组的元素,比如什么?

标签: ruby-on-rails dynamic rendering render partial-views


【解决方案1】:

以下是有效的:

module TasksHelper

  def render_task_form(task)
    render :partial => "/tasks/completed/#{task.task_type.downcase}"
  end
end

我很早之前就尝试过这个解决方案,但收到了一个错误消息:“部分名称 (/tasks/completed/) 不是有效的 Ruby 标识符;请确保您的部分名称以字母或下划线开头,并且后面跟字母、数字或下划线的任意组合。”

我又试了一次,为了解决这个问题,我从数据库中删除了所有任务。现在部分动态呈现。希望这对其他人有帮助!

【讨论】:

    【解决方案2】:

    您需要一个字符串而不是整个 task_types 数组。 @task.task_type 应该返回一个键,它 a) 匹配任务类型数组中的一个元素并且 b) 匹配一个已知的部分。

    以下内容有点复杂,它需要但应该可以解决问题:

    tasks_helper.rb
    module TasksHelper
    
      def completion_comment(task)
        if Task.task_types.include? task.task_type
          render  :partial => task.task_type,
                  :locals => {
                    :task => task
                  }
        else
          # render a generic comment box here
        end
      end
    end
    

    【讨论】:

    • 感谢您的帮助。您提供的代码仍然给了我整个数组,但我能够找到一个可行的解决方案。
    【解决方案3】:

    在 Rails 4 中,视图或部分名称应该响应有效的 Ruby 标识符。 因此,整个视图名称必须遵循与 ruby​​-identifier 相同的格式:

    • 应该以 _ 或字符开头
    • 不能以数字开头
    • 它只能有 _ 和字母数字。

    所以,考虑到 task_type 是一个有效的 ruby​​ 标识符(它应该是),它会起作用。在生成时,此代码在 Rails 4 中不起作用

    render '/tasks/completed/some-task' 
    

    但这会起作用

    render '/tasks/completed/some_task'  # note the underscore.
    

    【讨论】:

      猜你喜欢
      • 2018-04-17
      • 2011-05-08
      • 2012-07-26
      • 2015-12-16
      • 2016-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多