【问题标题】:ActionController::InvalidAuthenticityToken in rails 4Rails 4 中的 ActionController::InvalidAuthenticityToken
【发布时间】:2015-05-21 02:45:42
【问题描述】:

_form.html.erb:

<%= simple_form_for(@activity,:remote=>true, html: {multipart: true}) do |f| %>
    <div class="form-inputs">
      <%= f.input :name %>

    <%= f.input :logo%>
    </div>

    <div class="form-actions">
      <%= f.button :submit %>
    </div>
<% end %>

create.js.erb:

$(document).ready(function(){
<%if @activity.save %>
$('#divShow').html("<%= j (render 'activities/index') %>");
$('#myModal').modal('hide');
$('#notice').html("Activities is successfully created.").show();
<%else%>
$('.modal-body').html("<%= j (render 'activities/form') %>");
<%end%>
});

activities_controller:

def create
@activity = Activity.new(activity_params)
@activity.save
end

logs

ActivityController 处理#create as HTML

参数:{"utf8"=>"✓", "activity"=>{"name"=>"sds", “标志”=>#, @original_filename="1241112.png", @content_type="image/png", @headers="Content-Disposition: form-data; name=\"activity[logo]\"; filename=\"1241112.png\"\r\nContent-Type: image/png\r\n">}, “提交”=>“创建活动”}

无法验证 CSRF 令牌的真实性

在 1 毫秒内完成 422 个不可处理的实体

ActionController::InvalidAuthenticityToken

在视图页面中,我正在使用simple_form gem 和 CURD 操作与 JS。但是,我在创建新记录时收到文件上传错误(:logo)。请帮帮我,谢谢。

【问题讨论】:

  • 尝试将protect_from_forgery with: :null_session, :if =&gt; Proc.new { |c| c.request.format == 'application/json' } 添加到您的applicationscontroller
  • 这是一个Proc默认可用的类,你可以调用是作为过程
  • 在你的控制器创建方法中,你可以指定respond_to do |format| format.js } end
  • 并在视图中添加文件create.js
  • 我在respond_to do |format| 中得到ActionController::UnknownFormat 并且我已经有create.js.erb 文件...请参见上文

标签: jquery ruby-on-rails ruby-on-rails-4 file-upload


【解决方案1】:

我正在使用gem "remotipart" 解决问题:

1.将gem "remotipart" 添加到您的gemfile。

2.运行bundle exec rails g remotipart:install

3.在布局页面中添加&lt;%= javascript_include_tag :defaults %&gt;

4.将//= require jquery.remotipart添加到application.js文件中。

【讨论】:

    【解决方案2】:

    要在activity_controller.rb 中解决这个问题,请将其放在顶部:

     skip_before_filter :verify_authenticity_token, :only => :create
    

    您还必须定义模板,因此视图将是:

    def create
      @activity = Activity.new(activity_params)
      respond_to do |format|
        if @activity.save(activity_params)
          format.js {}  
        else
          format.js {}  
        end
      end
    end
    

    【讨论】:

    • respond_to do |format|Processing by ActivitiesController#create as HTML 中获取ActionController::UnknownFormat
    • 您尝试查看我在回答中的建议吗?它应该可以正常工作
    • 我测试了你的权利。如果您在 format.js => format.html { redirect_to @activity 之前添加此行,请注意:“活动已成功创建。” } 会工作,但我需要弄清楚为什么不获取 js 格式。
    • 为了能够读取 js 格式,您必须在 simple_form_for 行中添加 :format =&gt; :js '。我不明白为什么没有得到 :remote => true。
    猜你喜欢
    • 2018-11-02
    • 2018-11-27
    • 2017-11-13
    • 2015-11-23
    • 2015-01-10
    • 2014-05-11
    • 2015-10-31
    • 2016-11-14
    • 2019-12-25
    相关资源
    最近更新 更多