在模型中渲染视图

时间:2014-03-20 20:54:07

标签: ruby-on-rails ruby-on-rails-4 rails-activerecord simple-form actionview

我知道不应该从模型中呈现视图,但我无法理解处理此问题的更好方法。

我有一个simple_form表单,应该将对象列表显示为复选框:

= 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

这显示了一些更好的格式化信息,但它仍然变得非常复杂,我需要在某些时候添加像图像等信息。当然,从MVC的角度来看,它也是非常错误的。

我的想法是在应用程序/视图中创建一个部分,使用haml和我的应用程序的其余部分,并使我的to_label方法看起来像这样:

def to_label
  render "results/label"
end

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

2 个答案:

答案 0 :(得分:3)

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

<强>助手/ results_helper.rb

result_to_label(result)
    render(:template =>"results/label", :layout => nil , :locals => { :result => result }).to_s
end

然后,在您看来,您可以直接致电result_to_label(the_result)

<强>更新

在simple_form中,您可以使用lambda添加label_method

= f.association :results, collection: @search.results.all(order: 'cost'), label_method: lambda { |res| result_to_label(res) }

答案 1 :(得分:1)

以这种方式弯曲导轨会让你到达你不想去的地方。首先,您尝试通过使simple_form认为它是表单控件的标签来渲染复杂的html布局。在不使用simple_form的情况下构建自定义表单更有意义。因为使用自动标签生成渲染简单控件有点简单。而你远远超出了这一点。

因此,对我来说,解决问题的方法是在您的课程中定义to_partial_path

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

并使用以下内容呈现表单:

= render @results

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