使用has_many,through在Rails 5中未经许可的参数

时间:2017-07-01 02:34:23

标签: activerecord ruby-on-rails-5 strong-parameters

我一直在为我的约会模型获取未经许可的参数。

以下是我的模特

    class Appointment < ApplicationRecord
      belongs_to :client
      belongs_to :trainer
    end

    class Trainer < ApplicationRecord
      has_many :appointments
      has_many :clients, through: :appointments
    end

   class Client < ApplicationRecord
    has_many :appointments
    has_many :trainers, through: :appointments
  end

这是我的控制器,为了简洁,我刚刚列出了我的私人方法。

 def appt_params
    params.require(:appointment).permit(:appointment_date, client_id: [], 
    trainer_id: [])
   end

该错误表示培训师,客户的未经许可的参数。 我在强参数方法中遗漏了什么吗?

这是我的约会/新视图

<%= form_for @appointment do |f| %>
  <%= f.datetime_select :appointment_date %>
  <%= f.collection_select :trainer, Trainer.all, :id, :first_name %>
  <%= f.collection_select :client, Client.all, :id, :name %>
  <%= f.submit %>
<% end %>

我在appt_params方法中添加了集合,但仍然遇到了同样的错误。我仍然掌握着Rails,任何帮助都会受到赞赏,谢谢!

2 个答案:

答案 0 :(得分:1)

由于您已经使用了关联,因此只有client_id和trainer_id就足够了,那些整数形式应该不是数组。

因此,请将您的强参数方法代码更改为:

def appt_params
 params.require(:appointment).permit(:appointment_date, :client_id, 
 :trainer_id)
end

您的应用程序/新视图:

<%= form_for @appointment do |f| %>
  <%= f.datetime_select :appointment_date %>
  <%= f.collection_select :trainer_id, Trainer.all, :id, :first_name %>
  <%= f.collection_select :client_id, Client.all, :id, :name %>
  <%= f.submit %>
<% end %>

答案 1 :(得分:0)

运行时遇到的问题与您相同,经过数小时的调试,我得以解决:

这是我第一次尝试在Rails中使用与您相似的模型进行关联,因此大多数在线文档建议将id定义为client_ids:[],假设您的id是数组,而当它们绝对是整数作为我的参数时,

Parameters: {"utf8"=>"✓", "authenticity_token"=>"LEcwQ56xYJGpq2zIs6Cz0YbU7B7mBKRa6rhspVIxo9vEB5/UoFUvHYiN0UC0krTiIp+d0tzhit6DZT1Z8PmYYg==", "califica"=>{"text"=>"hi", "grade"=>"5", "user_id"=>"1", "party_id"=>"1"}, "commit"=>"Create Calification"}

我认为这是由于f.collection_select取了一个预期值。因此,在使用了:user_id => []user_id:[]之类的数组的许可之后,我总是得到Unpermitted参数的错误。

尝试了@Bharath的答案(是正确的),但仍然无法正常工作,那是我意识到我的旧模型不是使用引用(ActiveModel::UnknownAttributeError (unknown attribute 'user_id' for Calification.):)制作的,所以我不得不制作一个{ {3}}添加外键,然后一切正常。