4

小さなフォームをrender_to_string生成していますが、何らかの理由で CSRF トークンが正しく生成されません (つまり、ヘッダーとは異なり、送信時にユーザーがログアウトされ、ログに「CSRF トークンを確認できません」というメッセージが表示されます)。 )。関連するコードは次のとおりです。

コントローラ:

def publish
  @question = @event.questions.find(params[:id])
  @question.update_attribute(:published, true) unless @question.published?
  Pusher[@event.to_param].trigger('new_question', question: render_question)
  redirect_to event_path(@event)
end


private
  def render_question
    render_to_string('questions/_unanswered_question', locals: {question: @question}, layout: false)
  end
  def fetch_event
    @event ||= current_user.events.find(params[:event_id])
  end

私は Pusher を使用していますが、これは次の Javascript を使用してページにレンダリングされているだけであると想定できます。

$("#questions").append(data.question); // data is what I send from Pusher.

そして最後に、パーシャルがレンダリングされます:

.answer
  = form_for [@event, question, question.answers.new] do |f|
    %h2
      = question.title

    %ul
      - (1..5).each do |n|
        - if question.send("answer_#{n}").present?
          %li
            = f.radio_button :option, n, id: "q_#{question.id}_answer_option_#{n}"
            = f.label question.send("answer_#{n}"), for: "q_#{question.id}_answer_option_#{n}"

    %p
      = f.submit "Answer"

これは、ページに追加しなくても問題なく機能しますが、レイアウト内でレンダリングされます。これはリモート フォームではないことに注意してください。

4

1 に答える 1

0

ajax を使用してフォームを生成し、それを Dom に追加しているようです。csrf トークンは、リクエストごとに新しく生成されます。私の知る限り、ヘッダーで利用可能な csrf トークンを使用し、js を使用してフォーム内のトークンを置き換える必要があります。

次のようになります。

success: ()->
  parameter = $("meta[name=csrf-param]").attr("content")
  token     = $("meta[name=csrf-token]").attr("content")
  question  = $(data.question).find("[name="+parameter+"]").val(token)

現在、最初にそれをテストするコンピューターがないので、うまくいけば私は正しいです:/

于 2013-08-16T04:44:24.930 に答える