2016-01-18 4 views
0

Что помощник можно использовать в модели для заполнения HTML код в строка в зрения?Использование помощника в модели

Это метод, который я в настоящее время использую в моей модели:

def state_country_name 
    "#{self.name} (#{self.country.name})" 
end 

Я хочу wrapp {self.country.name} внутри пролете с class: pull-right.

Я уже пробовал:

def state_country_name 
    "#{self.name} #{helpers.content_tag(:span, self.country.name, class: "pull-right")}" 
    end 

    def helpers 
    ActionController::Base.helpers 
    end 

Результат:

London <span>England</span> 

Я использую автозаполнения-rails4-камень и это моя форма ввода:

= f.input :city_name, :url => autocomplete_city_name_companies_path, :as => :autocomplete, :id_element => "#company_city_id", input_html: {:value => @company.city.name, class: 'form-control'} 

Код для моего autocomplete_city_name_companies действия:

autocomplete :city, :name, :full => false, :display_value => :state_country_name, :extra_data => [:state_id] 
+2

Почему вы делаете это в модели? –

+0

Да, как уже упоминалось, в представлении находится в html-коде вместо строки в представлении. – Rubioli

+0

Причина: Мне нужно сделать это в модели, потому что я использую автозаполнение. – Rubioli

ответ

2

Я бы рекомендовал принимать Presenter подход здесь, как это даст вам место, чтобы поместить логику представления, которая может работать с рубиновыми моделями, но логика которых не принадлежит самой модели. Вы можете использовать Draper или один из нескольких других драгоценных камней, которые делают это, но вот какой-то код, чтобы продемонстрировать, насколько просто это понятие на самом деле:

Образец ведущий:

class CompanyPresenter < Struct.new(:company) 
    def state_country_name 
    company.country.name 
    end 

    # act as proxy for unknown methods 
    def method_missing(method, *args, &block) 
    company.public_send(method, *args, &block) 
    end 
end 

@presentable_company = CompanyPresenter.new(@company) 

Или, если вы хотите взять декоратор:

module CompanyPresenter 
    def state_country_name 
    country.name 
    end 
end 

class Company < ActiveRecord::Base 
    def decorate! 
    self.extend CompanyPresenter 
    end 
end 

@company.decorate! 
1

Я думаю, что вы не должны делать это в ваших моделях. Вместо этого поместите свои методы помощников в файл ваших помощников. В вашем model_helper.rb:

def my_helper(model) 
html = <<-EOT 
<span class="pull-right">{model.country.name}</span> 
EOT 
html.html_safe 
end 

На ваш взгляд:

<%= my_helper(@model_object) %> 
+0

Остерегайтесь использования 'html_safe' для чего-либо, что на самом деле не может быть« безопасным »(в первую очередь, данными из неизвестного источника). – PinnyM