accepts_nested_attributes_for取决于Thinking Sphinx(bug?)

时间:2016-08-26 08:09:10

标签: ruby-on-rails thinking-sphinx

  • Ubuntu 16.04.1 LTS
  • Rails 5.0.0
  • ruby​​ 2.3.1p112(2016-04-26)[x86_64-linux-gnu]
  • gem'mysql2','〜> 0.3.18',: platform => :红宝石
  • 宝石'思考 - 狮身人面像','〜> 3.2.0'
  • PostgreSQL 9.5.3

我在我的Rails 5项目中设置了Sphinx搜索引擎,它(可能)打破了Rails accepts_nested_attributes_for 方法。至少 accepts_nested_attributes_for 方法只有在 Gemfile 中设置这些行时才有效:

gem 'mysql2',          '~> 0.3.18', :platform => :ruby
gem 'thinking-sphinx', '~> 3.2.0'

如果没有这些行 accepts_nested_attributes_for 不起作用! “不起作用”意味着嵌套模型不是通过父创建表单创建的(我得到错误:

  

1错误禁止此用户被保存:文章用户必须   存在

我将我的项目上传到Heroku,问题也发生在那里 - 完全相同(即使Heroku不支持Sphinx免费)。

这是我在GitHub上的测试项目:https://github.com/dorelly2/test-project。这仅仅是一个脚手架生成的测试项目。

我制作了2个Heroku应用程序,它们演示了不同的行为,这取决于Gemfile中是否注释掉了2行(如上所述)。你可以和他们玩,看看。尝试在两个应用中创建NameArticle title的用户,您会看到差异:

https://test-project-ts.herokuapp.com/

https://test-project-ts-bad.herokuapp.com/

以下是代码示例:

class User < ApplicationRecord
   has_many :articles, dependent: :destroy
   accepts_nested_attributes_for :articles
end

class Article < ApplicationRecord
  belongs_to :user
end

视图:

<%= form_for(user) do |f| %>
...

  <div class="field">
    <%= f.label :name %>
    <%= f.text_field :name %>
  </div>

  <%= f.fields_for :articles, Article.new do |ff| %>
    <div class="field">
      <%= ff.label "Article title" %>
      <%= ff.text_field :title %>
    </div>
  <% end %>
...

控制器是脚手架生成的 - 没有必要在这里显示它们。

发生了什么事?有人可以澄清吗? accepted_nested_attributes_for 通常是否可以在没有Thinking Sphinx的情况下工作?

1 个答案:

答案 0 :(得分:1)

这实际上是Rails / ActiveRecord 5.0中的行为更改,而Thinking Sphinx中的一个错误使其停止工作:belongs_to关联默认为已进行验证。

TS中的错误是固定的,尽管新版本尚未通过该修复程序发布。详细信息如下:Thinking-spinx breaks belongs_to built-in validation