强参数:不允许的参数:has_many_through 关系中的标签 [英] Strong parameters: Unpermitted parameters: tags in has_many_through relation

查看:52
本文介绍了强参数:不允许的参数:has_many_through 关系中的标签的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有几个模型/控制器:

I have a few models/controllers:

event.rb:

class Event < ActiveRecord::Base
  belongs_to :category
  belongs_to :user
  has_many :event_tags
  has_many :tags, through: :event_tags
  has_many :event_skills
  has_many :skills, through: :event_skills

tag.rb

class Tag < ActiveRecord::Base
  has_many :events, through: :event_tags
  has_many :event_tags
end

event_tag.rb

class EventTag < ActiveRecord::Base
  belongs_to :event
  belongs_to :tag
end

user.rb:

class User < ActiveRecord::Base
  has_many :events # organized_events

events_controller.rb

class EventsController < ApplicationController
...

def create
    @event = Event.new(event_params)
    @event.user_id = current_user.id

    respond_to do |format|
      if @event.save
        format.html { redirect_to @event, notice: 'L\'évènement a été crée.' }
        format.json { render json: @event, status: :created, location: @event }
      else
        format.html { render action: "new" }
        format.json { render json: @event.errors, status: :unprocessable_entity }
      end
    end
  end

...

private
  def event_params
    params[:event][:date] = '%s %s' % [params[:event][:date].andand.split('/').reverse.join('-'),
                                       params[:event][:hour].andand.sub('h', ':')]
    params[:event].delete :hour
    params[:event][:tags] = params[:event][:tags].split(';').map { |t| Tag.where(name: t).first_or_create }
    params[:event][:skills] = params[:event][:skills].split(';').map { |s| Skill.where(name: s).first_or_create }
    binding.pry
    params.require(:event).permit(:user_id,
                                  :name,
                                  :date,
                                  :hour,
                                  :description,
                                  :picture,
                                  :category_id,
                                  {tags: []},
                                  {skills: []},
                                  :spots)

我的问题是,当我提交表单以创建事件时,我得到:

My problem is that when I submit the form to create an event, I get:

不允许的参数:标签

是的,我看过这篇文章:Rails 4 Unpermitted Parameters for Array.我已经尝试添加:tags: [].但这对我来说似乎不起作用.

Yes, I've seen this post: Rails 4 Unpermitted Parameters for Array. And I've tried adding: tags: []. But it doesn't seem to work in my case.

调试信息:(在上面的 binding.pry 断点处)

Debug info: (at the binding.pry breakpoint you see above)

[4] pry(#<EventsController>)> params
=> {"utf8"=>"✓",
 "authenticity_token"=>"634lFWEsVDCD+yqPKBigmEJB0kRdHlLmyJpRwjTTVhU=",
 "event"=>
  {"name"=>"test tag 17",
   "category_id"=>"1",
   "date"=>" ",
   "tags"=>
    [#<Tag id: 3, name: "beer", created_at: "2014-12-05 11:21:27", updated_at: "2014-12-05 11:21:27">,
     #<Tag id: 4, name: "vodka", created_at: "2014-12-05 11:21:27", updated_at: "2014-12-05 11:21:27">,
     #<Tag id: 5, name: "champain", created_at: "2014-12-05 11:21:27", updated_at: "2014-12-05 11:21:27">],
   "skills"=>[],
   "spots"=>"",
   "description"=>"sdfsf"},
 "action"=>"create",
 "controller"=>"events"}
[5] pry(#<EventsController>)> event_params
Unpermitted parameters: tags
=> {"name"=>"test tag 17", "date"=>" ", "description"=>"sdfsf", "category_id"=>"1", "skills"=>[], "spots"=>""}
[6] pry(#<EventsController>)>

  • 如何正确允许 :tags 参数?
  • 我是否应该以不同的方式处理标签的提交(例如:event_params 方法是否适合使用 split 进行解析)?
  • 推荐答案

    来自 文档

    只有允许的标量才能通过过滤器.... 传递关联值为 String、Symbol、NilClass、Numeric、TrueClass、FalseClass、Date、Time、DateTime、StringIO、IO、ActionDispatch::Http::UploadedFile 或 Rack::Test::UploadedFile 类型的参数.否则,键 :name 将被过滤掉.

    Only permitted scalars pass the filter. ... passes params whose associated value is of type String, Symbol, NilClass, Numeric, TrueClass, FalseClass, Date, Time, DateTime, StringIO, IO, ActionDispatch::Http::UploadedFile or Rack::Test::UploadedFile. Otherwise, the key :name is filtered out.

    在您允许属性之前,您不能将标签数组元素转换为 AR 对象.您首先需要允许参数,然后您可以使用对象对其进行变异.

    You cannot convert tag array elements to AR objects before you permit the attributes. You first need to permit the params, then you can mutate it with objects.

    更新:查看 railscasts 你可以看到一个模型,有一个方法:tagged_with

    Updated: Looking at railscasts you can see that a model, has a method: tagged_with

    您可以创建:

    class Event < ActiveRecord::Base
      def tagged_with(*tag_names)
        # create (or build) your tags
      end
    end
    

    在您的控制器中,您将拥有 event_paramstag_paramsskill_params

    In your controller, you'd have event_params, tag_params and skill_params

    def create
      @event = Event.new(event_params)
      @event.tagged_with(tag_params)
      # Same thing with skills
      @event.user_id = current_user.id
      ...
    end
    
    ...
    
    def tag_params
      params.require(:event).permit(tags: [])
    end
    

    这篇关于强参数:不允许的参数:has_many_through 关系中的标签的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆