Rails content_tag вставляет дополнительные символы "<" и ">" - PullRequest
0 голосов
/ 24 января 2011

При этом:

def user_log
    if logged_in? == false
        form_tag session_path, :id => "mform" do
            content_tag(:span, content_tag(text_field_tag :email, "email@domain.com"), :class => "memail")+
            content_tag(:span, content_tag(password_field_tag :password, "12345678912"), :class => "mpass")+
            content_tag(:span, content_tag(submit_tag 'Login'), :class => "mbutton")
        end
    else
        ...     
        end
    end
end

Я получаю это:

переполнение стека не позволяет мне публиковать фотографии

Так как я нене хотите лишние "<" и ">", что я делаю не так?

РЕДАКТИРОВАТЬ: В качестве дополнительной информации, на мой взгляд, я просто делаю:

<%= user_log %>

Ответы [ 3 ]

3 голосов
/ 24 января 2011

Основная проблема заключается в том, что вы используете content_tag дважды, когда вам это не нужно. content_tag по существу вызывает content_tag_string .Вот источник content_tag_string:

def content_tag_string(name, content, options, escape = true)
  tag_options = tag_options(options, escape) if options
  "<#{name}#{tag_options}>#{content}</#{name}>".html_safe
end

Вызов content_tag(text_field_tag :email, "email@domain.com") выглядит следующим образом:

"<#{text_field_tag :email, "email@domain.com"}>"

, а text_field_tag ​​уже создает полный HTML-тег (включает «<» и «> ").

Все, что вам нужно сделать, чтобы избавиться от лишних угловых скобок, это пропустить второй content_tag:

content_tag(:span, text_field_tag(:email, "email@domain.com"), :class => "memail")+
0 голосов
/ 24 января 2011

Хотя я не пробовал это локально, проблема, вероятно, в том, что Rails - это html, избегающий вашего удобного вспомогательного метода.Чтобы проверить, прав ли я, попробуйте добавить это по вашему мнению:

<%= raw(user_log) %>

Если это сработает, вместо этого вы можете добавить raw в свой вспомогательный метод:

def user_log
    if logged_in? == false
        raw(form_tag session_path, :id => "mform" do
            content_tag(:span, content_tag(text_field_tag :email, "email@domain.com"), :class => "memail")+
            content_tag(:span, content_tag(password_field_tag :password, "12345678912"), :class => "mpass")+
            content_tag(:span, content_tag(submit_tag 'Login'), :class => "mbutton")
        end)
    else
        ...     
    end
end

raw сообщает Rails, что этот код безопасен и не требует экранирования html.

0 голосов
/ 24 января 2011

В качестве первого предположения я мог бы попробовать что-то вроде:

if logged_in? == false
  ...
else
  ...
end.html_safe

Обновление: Хорошо, вернемся к чертежной доске.

Как второе предположение, попробуйте это. (И обратите внимание на дополнительный параметр content_tag, который требовал явного хэша {} ...)

def user_log
    if logged_in? == false
        form_tag session_path, :id => "mform" do
          (
            content_tag(:span, content_tag(text_field_tag :email, "email@domain.com"),   {:class => "memail"},   false)+
            content_tag(:span, content_tag(password_field_tag :password, "12345678912"), {:class => "mpass"},    false)+
            content_tag(:span, content_tag(submit_tag 'Login'),                          {:class => "mbutton"},  false)
          ).html_safe
        end
    else
        ...     
        end
    end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...