Redactor Rails - Как сохранить контент в базу данных?


person spl    schedule 23.04.2013    source источник


Ответы (2)


Вы не должны использовать метод raw text_area_tag. Вы должны использовать методы API simple_form. Вот пример (в Slim, но вы должны понять):

= simple_form_for(comment) do |f|

  = f.input :content, input_html: { class: 'redactor', rows: '4' }

  = f.button :submit

Следующий. Редактор не очищает ввод пользователя. Вы должны сделать это вручную.

Пример кода контроллера (в частности, создать действие):

class CommentsController
  # used for sanitization user's input
  REDACTOR_TAGS = %w(code span div label a br p b i del strike u img video audio
                  iframe object embed param blockquote mark cite small ul ol li
                  hr dl dt dd sup sub big pre code figure figcaption strong em
                  table tr td th tbody thead tfoot h1 h2 h3 h4 h5 h6)
  REDACTOR_ATTRIBUTES = %w(href)

  # ...

  def create
    params[:comment][:content] = sanitize_redactor(params[:comment][:content])

    comment = Comment.create(params[:comment])

    if comment.save
      # ...
    end
  end

  # ...

  private

  def sanitize_redactor(orig_text)
    stripped = view_context.strip_tags(orig_text)
    if stripped.present? # this prevents from creating empty comments
      view_context.sanitize(orig_text, tags: REDACTOR_TAGS, attributes: REDACTOR_ATTRIBUTES)
    else
      nil
    end
  end 
end
person Sergey Kuznetsov    schedule 23.04.2013
comment
Можете ли вы помочь мне понять, почему нам нужно очищать/дезинфицировать ввод пользователя? - person spl; 23.04.2013
comment
Это потому, что ваше приложение ожидает параметры, названные обычным образом. В моем примере содержимое комментария должно поступать в мой CommentController как params[:comment][:content] (оно получается из атрибута name поля ввода). Когда вы используете простой text_area_tag, вы должны установить имя ввода самостоятельно. - person Sergey Kuznetsov; 23.04.2013
comment
Нам нужно дезинфицировать пользовательский ввод, чтобы предотвратить различные виды хакерских атак, в частности XSS (когда злоумышленник вставляет код javascript на вашу страницу). Пожалуйста, погуглите про XSS-атаки. - person Sergey Kuznetsov; 23.04.2013
comment
Итак, я следовал вашему f.input для редактора, но когда я называю его, project.content, он выходит не в том формате, в котором был отправлен, как это можно исправить? - person spl; 24.04.2013
comment
Итак, я обновил blogupdates_controller.rb, как вы упомянули, и получил NameError для: sanitize_redactor:: def create params[:blogupdate][:content] = sanitize_redactor(params[:blogupdate][:content]) [at]project = Project.find( params[:project_id]) [at]blogupdate = @project.blogupdates.create!(params[:blogupdate]) redirect_to [at]blogupdate.project end - person spl; 26.04.2013

Для тех, кто не использует simple_form, это также работает:

<div class="redactor_box">
    <%= f.text_area :content, placeholder: "Content goes here...", :class => "redactor"%>
</div>
person Jack    schedule 30.06.2013