Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.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 4_Rails Activerecord_Simple Form_Actionview - Fatal编程技术网

Ruby on rails 在模型中渲染视图

Ruby on rails 在模型中渲染视图,ruby-on-rails,ruby-on-rails-4,rails-activerecord,simple-form,actionview,Ruby On Rails,Ruby On Rails 4,Rails Activerecord,Simple Form,Actionview,我知道视图不应该从模型渲染,但我想不出更好的方法来处理这个问题 我有一个简单的表单,它应该以复选框的形式显示对象列表: = f.association :results, collection: @search.results.all(order: 'cost'), as: :check_boxes 这样,它只会在复选框旁边显示对象,但我需要显示一组更详细的信息,因此我在模型中定义to_label方法,如下所示: class Result < ActiveRecord::Base b

我知道视图不应该从模型渲染,但我想不出更好的方法来处理这个问题

我有一个简单的表单,它应该以复选框的形式显示对象列表:

= f.association :results, collection: @search.results.all(order: 'cost'), as: :check_boxes
这样,它只会在复选框旁边显示对象,但我需要显示一组更详细的信息,因此我在模型中定义to_label方法,如下所示:

class Result < ActiveRecord::Base
  belongs_to :search

   def to_label
         "<div class='row'>
            <div class='col-md-2'>#{supplier}</br><span class='label label-default'>#{brand}</span></div>
            <div class='col-md-2'>#{desc}</div>
            <div class='col-md-2'>#{model}</div>
            <div class='col-md-1'>#{season}</div>
            <div class='col-md-1'>#{qty}</div>
            <div class='col-md-1'>#{expected_delivery}</div>
            <div class='col-md-1'>#{msrp}</div>
            <div class='col-md-1'>#{cost}</div>
         </div>".html_safe
   end

end
def to_label
  render "results/label"
end

当然rails不允许我这样做,但我对如何实现它没有更好的想法。

您不应该从模型访问视图。相反,创建一个助手,其函数接收结果对象作为参数(代码未测试):

助手/结果\u helper.rb

result_to_label(result)
    render(:template =>"results/label", :layout => nil , :locals => { :result => result }).to_s
end
然后,从视图中直接调用
result\u到\u标签(结果)

更新

在您的简单表单中,您可以添加
label\u方法


您不应该从模型访问视图。相反,创建一个助手,其函数接收结果对象作为参数(代码未测试):

助手/结果\u helper.rb

result_to_label(result)
    render(:template =>"results/label", :layout => nil , :locals => { :result => result }).to_s
end
然后,从视图中直接调用
result\u到\u标签(结果)

更新

在您的简单表单中,您可以添加
label\u方法


这样弯曲铁轨会把你带到你不想去的地方。首先,您试图通过使简单的表单成为表单控件的标签来呈现复杂的html布局。在不使用简单表单的情况下构建自定义表单更有意义。因为通过自动标签生成呈现简单控件是一件很简单的事情。你已经远远超越了这一点

因此,我认为解决您问题的方法是在您的课堂上定义:

class Result < ActiveRecord::Base
  def to_partial_path
    'results/form'
  end
end

它可以在简单表单内部呈现,您只需要使用rails或简单表单助手构建表单控件。

这样弯曲rails将使您到达不想到达的地方。首先,您试图通过使简单的表单成为表单控件的标签来呈现复杂的html布局。在不使用简单表单的情况下构建自定义表单更有意义。因为通过自动标签生成呈现简单控件是一件很简单的事情。你已经远远超越了这一点

因此,我认为解决您问题的方法是在您的课堂上定义:

class Result < ActiveRecord::Base
  def to_partial_path
    'results/form'
  end
end

它可能在简单表单中呈现,您只需要使用rails或简单表单帮助程序构建表单控件。

我不确定我是否理解如何将其传递给简单表单关联。标签法适用于什么?“=f.association:results,collection:@search.results.all(顺序:'cost'),as::复选框,label\u method:?”您的解决方案对回答我的问题非常有用。无论如何,这是一个地狱的维护和扩展。我要转到@Sergey Moiseev的解决方案。谢谢。我不确定我是否理解我应该如何将它传递给简单形式协会。标签法适用于什么?“=f.association:results,collection:@search.results.all(顺序:'cost'),as::复选框,label\u method:?”您的解决方案对回答我的问题非常有用。无论如何,这是一个地狱的维护和扩展。我要转到@Sergey Moiseev的解决方案。谢谢。听起来是一个很好的解决方案,但我会接受@Sergio的回答,因为它保持了简单的形式。好吧,在扩展解决方案时请考虑一下。我刚刚在我的一个项目上讲了同样的故事,并通过完全删除简单表单甚至rails表单字段来完成它,用json api和angularjs替换它们。我必须在简单的表格中手工创建表格。在阅读了文档之后,这比看起来要容易得多。只需要创建这样一个表:“-@search.results.each do | result |”并在我的表中插入这样一个复选框:“%td=check_-box_-tag”quote[result_-id][]”,result.id“听起来是个不错的解决方案,但我会接受@Sergio的答案,因为它保持了简单的形式OK,在扩展解决方案时请考虑一下。我刚刚在我的一个项目上讲了同样的故事,并通过完全删除简单表单甚至rails表单字段来完成它,用json api和angularjs替换它们。我必须在简单的表格中手工创建表格。在阅读了文档之后,这比看起来要容易得多。只需要创建一个如下表:“-@search.results.each do | result |”并在我的表中插入一个复选框:“%td=check_box_tag”quote[result_id][]”,result.id”