2

在我正在开发的应用程序中,我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方法中提取数组元素(正如您在错误消息中看到的那样,括号和引号被拉入渲染操作)。或者,也许我需要使用不同的方法来动态渲染部分。任何帮助表示赞赏。

4

3 回答 3

2

这是有效的:

module TasksHelper

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

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

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

于 2013-03-08T20:02:46.573 回答
0

您需要一个字符串而不是整个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
于 2013-03-07T22:30:56.693 回答
0

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

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

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

render '/tasks/completed/some-task' 

但这会起作用

render '/tasks/completed/some_task'  # note the underscore.
于 2013-09-22T08:14:45.950 回答