ruby-on-rails - 强参数 has_many 通过

标签 ruby-on-rails

试图找出 setter 不起作用的原因:

class Company < ActiveRecord::Base
  has_many :memberships 
  has_many :users, :through => :memberships, dependent: :destroy

end

class Membership < ActiveRecord::Base
  belongs_to :user
  belongs_to :company

  validates_presence_of :user
  validates_presence_of :company

end

class User < ActiveRecord::Base
  has_many :memberships
  has_many :companies, :through => :memberships, dependent: :destroy
  accepts_nested_attributes_for :companies
end

<%= form_for(@user) do |f| %>
  <% if @user.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@user.errors.count, "error") %> prohibited this user from being saved:</h2>

      <ul>
      <% @user.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.fields_for :company do |ff|%>
      <%= ff.label :name %><br>
      <%= ff.text_field :name %>
    <% end %>
  </div>

  <div class="field">
    <%= f.label :name %><br>
    <%= f.text_field :name %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

# Never trust parameters from the scary internet, only allow the white list through.
def user_params
  params.require(:user).permit(:name, companies_attributes:[:name])
end

当我这样做时它就起作用了:

# Never trust parameters from the scary internet, only allow the white list through.
def user_params
  params.require(:user).permit(:name, company:[:name])
end

所以对我来说还不太清楚,因为文档说 setter company_attributes在accepts_nested_attributes_for :companies时被删除

最佳答案

当将 fields_foraccepts_nested_attributes_for 一起使用时,它们需要匹配。请参阅http://apidock.com/rails/ActionView/Helpers/FormHelper/fields_for

您有 accepts_nested_attributes_for :companyf.fields_for :company 因此断开连接。

所以尝试更改您的表单以包含

<div class="field">
    <%= f.fields_for :companies do |ff|%>
      <%= ff.label :name %><br>
      <%= ff.text_field :name %>
    <% end %>
  </div>

你的 user_params 方法是

def user_params
  params.require(:user).permit(:name, companies_attributes:[:name])
end

这应该会导致它们填充在 companies_attributes 下,并且您原来的 user_params 方法可以正常工作。因为 fields_for 应该生成 user[companies_attributes[id][name]] 因为 user has_many Companies (您是否希望在要创建的列表?)

关于ruby-on-rails - 强参数 has_many 通过,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27706759/

相关文章:

ruby-on-rails - 你如何在 Rails 中按一天中的时间过滤记录?

ruby-on-rails - 从 Helper 获取数据或在 Rails 中使用 Model

ruby-on-rails - rails 助手

ruby-on-rails - 如何在 ActiveRecords 中创建对 Ruby 对象的引用?

ruby-on-rails - 在 Rails 3 中返回空 JSON 响应的首选方法是什么?

ruby-on-rails - Rails 关联 - 简单连接

ruby-on-rails - Elasticsearch新手:与Rails和localhost:9200集成

ruby-on-rails - 运行heroku open时出现Heroku Config Secret Key Base错误

javascript - try() activesupport 方法的 coffeescript 模拟

ruby-on-rails - Ruby On Rails 4 会默认将 config.active_record.whitelist 属性设置为 true 吗?