将Rails find_or_create_by与表单对象一起使用

绝望的

我正在创建一个Rails库应用,其中有一种类型的has_many书和belongs_to一种类型的书我需要使用表单对象,因为我的数据模型最终将具有多个多对多的关系,并且因为我想学习如何使用表单对象。我已经基于Rails Cast#416表单对象创建了表单对象。我的表单,表单对象,模型和控制器似乎都可以正常工作。创建了新书并将它们与流派相关联,但是它们都是流派“流派”。我正在使用find_or_create_by我认为问题出在book_form.rb哪里@genre ||= Genre.find_by(name: :name),实际上没有从表单中传递流派信息。我的相关代码如下:

样板书.rb

class Book < ActiveRecord::Base
  belongs_to :genre
  before_save :convert_isbn
.
.
.
end

型号genre.rb

class Genre < ActiveRecord::Base
  has_many :books, dependent: :destroy
  validates_associated :books
end

book_form.rb

class BookForm
  include ActiveModel::Model

  def self.model_name
    ActiveModel::Name.new(self, nil, "Book")
  end
.
.
.
  validates :name, presence: true

  delegate :name, to: :genre
  delegate :title, :year, :pages, :isbn, :summary, :volume_a, :volume_b, to: :book

  def genre
    @genre ||= Genre.find_by(name: :name)
  end

  def book
    @book ||= genre.books.build
  end

  def submit(params)
    genre.attributes = params.slice(:name).permit(:name)
    book.attributes = params.slice(:title, :year, :pages, :isbn, :summary, :volume_a,:volume_b).permit(:title, :year, :pages, :isbn, :summary, :volume_a,:volume_b)
    if valid?
      genre.save!
      book.save!
      true
    else
      false
    end
  end
end

books_controller.rb

class BooksController < ApplicationController
  before_action :admin_user, only: [:new, :edit, :destroy]

  def new
    @book_form = BookForm.new
    @genres = Genre.all
  end

  def create
    @book_form = BookForm.new
    @genres = Genre.all
    if @book_form.submit(params[:book])
      flash[:success] = "You've added a new book to the library!"
      redirect_to @book_form
    else
      render 'new'
    end
  end

查看new.html.erb

<%= form_for @book_form do |f| %>
  <%=render 'shared/error_messages', object: f.object %>

  <%= f.label :title %>
  <%= f.text_field :title, class: 'form-control' %>
  .
  .
  .
  <%= f.label :genre %><br>

  <%= collection_select(:genre, :name, Genre.all, :name, :name) %>
  <br>
  <br>
  <%= f.submit "Add book to library", class: "btn btn-primary" %>
<% end %>

使用Pry gem,我可以从服务器上获得这本书:

Started POST "/books" for ::1 at 2016-02-22 14:19:20 -0700
Processing by BooksController#create as HTML
  Parameters: {"utf8"=>"✓",     "authenticity_token"=>"bPusgyl9n+p07eQsEAe9CpSsithtkg33HMifj8KTsidv3GDLuhjibOC7d2mm5boC4w7ZUne64R4n4OMQotDE4g==",
               "book"=>{"title"=>"test",
               "year"=>"2016",
               "pages"=>"222",
               "isbn"=>"9780-xx-xx-xx",
               "summary"=>"fake summary",
               "volume_a"=>"1",
               "volume_b"=>"2"},
               "genre"=>{"name"=>"Mystery"},
               "commit"=>"Add book to library"}

From: /home/nathaniel/rails_apps/allredlib/app/forms/book_form.rb @ line 38 BookForm#submit:

    37: def submit(params)
 => 38:   binding.pry
    39:   genre.attributes = params.slice(:name).permit(:name)
    40:   book.attributes = params.slice(:title, :year, :pages, :isbn, :summary, :volume_a,:volume_b).permit(:title, :year, :pages, :isbn, :summary, :volume_a,:volume_b)
    41:   if valid?
    42:     genre.save!
    43:     book.save!
    44:     true
    45:   else
    46:     false
    47:   end
    48: end

因此,书体裁正在参数中传递,但是我在书本形式中访问的方式错误。如果我将其注释掉binding.pry,则该表格会创建一本类型为“名称”的新书,而不是像我希望的那样类型为“神秘”的书。

当我@genre在使用binding.pry的同时输入rails时,我得到

[1] pry(#<BookForm>)> @genre
=> #<Genre:0x007f19554e1220
 id: 20,
 name: "name",
 book_id: nil,
 created_at: Thu, 25 Feb 2016 20:28:45 UTC +00:00,
 updated_at: Thu, 25 Feb 2016 20:28:45 UTC +00:00>

最新的binding.pry结果27:def genre => 28:binding.pry 29:@genre || = Genre.find_or_initialize_by(name::name)30:#@ genre || = Genre.find_or_initialize_by(name:params [:genre ] [:name])31:结束

lacostenycoder

如果要按名称查找流派,则需要在方法的选项哈希中传递名称属性。

def genre
  @genre ||= Genre.find_or_create_by(name: :name)
end

更新

改变

genre.attributes = params.slice(:name).permit(:name)

genre.attributes = { :name => params[:genre][:name] }

还要在genre.save之前和之后抛出binding.pry!并查看您键入后得到的结果,@genre因为您的流派方法应该已经创建了该实例变量,您刚刚向其发送参数的实例变量genre.attributes接受了哈希。

我会在书本参数上考虑相同的内容,但是如果切片工作得很好的话。

另外,由于您是Genre.all在窗体视图中调用的,因此您可能不需要在控制器操作中执行此操作,但是如果这样做,则考虑@genres在窗体视图中使用该对象,collection_select因为您要两次发出所有请求在模型上。

@genres = Genre.all

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用/不使用Rails find_or_create_by

来自分类Dev

将GraphQL与rails一起使用

来自分类Dev

将Packery与Rails一起使用

来自分类Dev

如何将Bootstrap表单选择CSS与Rails模型一起使用?

来自分类Dev

将makeObjectsPerformSelector与对象一起使用

来自分类Dev

表单对象:将重整宝石与用户/宠物示例一起使用

来自分类Dev

将xargs与find一起使用

来自分类Dev

Ruby on Rails-将where与对象数组一起使用

来自分类Dev

Ruby on Rails-将where与对象数组一起使用

来自分类Dev

在Rails中,如何将find_each方法与索引一起使用?

来自分类Dev

将WHERE IN与Rails准备的语句语法一起使用

来自分类Dev

将page.js与sinatra(或rails)一起使用

来自分类Dev

将Select 2与form_for rails一起使用

来自分类Dev

如何将SSSS与Rails一起使用

来自分类Dev

TypeError:对象{...}没有方法'find'-当将mongoose与express一起使用时

来自分类Dev

TypeError:对象{...}没有方法'find'-当将mongoose与express一起使用时

来自分类常见问题

将Q对象与变量一起使用

来自分类Dev

将Automapper与抽象对象的集合一起使用

来自分类Dev

如何将requestAnimationFrame与TypeScript对象一起使用?

来自分类Dev

将Angularjs ngBind与javascript对象一起使用

来自分类Dev

如何将IN与块而不是对象一起使用?

来自分类Dev

将cat()与调用对象一起使用

来自分类Dev

将%w与对象的字符串一起使用

来自分类Dev

如何将QVector与多个对象一起使用

来自分类Dev

如何将componentsSeparatedByString与多个对象一起使用

来自分类Dev

将Celery Chunk与对象或整数序列一起使用

来自分类Dev

将NSCoding与领域模型对象一起使用

来自分类Dev

将diff与漂亮的汤对象一起使用

来自分类Dev

将init和didSet与NSManaged对象一起使用

Related 相关文章

  1. 1

    使用/不使用Rails find_or_create_by

  2. 2

    将GraphQL与rails一起使用

  3. 3

    将Packery与Rails一起使用

  4. 4

    如何将Bootstrap表单选择CSS与Rails模型一起使用?

  5. 5

    将makeObjectsPerformSelector与对象一起使用

  6. 6

    表单对象:将重整宝石与用户/宠物示例一起使用

  7. 7

    将xargs与find一起使用

  8. 8

    Ruby on Rails-将where与对象数组一起使用

  9. 9

    Ruby on Rails-将where与对象数组一起使用

  10. 10

    在Rails中,如何将find_each方法与索引一起使用?

  11. 11

    将WHERE IN与Rails准备的语句语法一起使用

  12. 12

    将page.js与sinatra(或rails)一起使用

  13. 13

    将Select 2与form_for rails一起使用

  14. 14

    如何将SSSS与Rails一起使用

  15. 15

    TypeError:对象{...}没有方法'find'-当将mongoose与express一起使用时

  16. 16

    TypeError:对象{...}没有方法'find'-当将mongoose与express一起使用时

  17. 17

    将Q对象与变量一起使用

  18. 18

    将Automapper与抽象对象的集合一起使用

  19. 19

    如何将requestAnimationFrame与TypeScript对象一起使用?

  20. 20

    将Angularjs ngBind与javascript对象一起使用

  21. 21

    如何将IN与块而不是对象一起使用?

  22. 22

    将cat()与调用对象一起使用

  23. 23

    将%w与对象的字符串一起使用

  24. 24

    如何将QVector与多个对象一起使用

  25. 25

    如何将componentsSeparatedByString与多个对象一起使用

  26. 26

    将Celery Chunk与对象或整数序列一起使用

  27. 27

    将NSCoding与领域模型对象一起使用

  28. 28

    将diff与漂亮的汤对象一起使用

  29. 29

    将init和didSet与NSManaged对象一起使用

热门标签

归档