gpt4 book ai didi

ruby-on-rails - 使用带有表单对象的 Rails find_or_create_by

转载 作者:行者123 更新时间:2023-12-04 03:48:28 26 4
gpt4 key购买 nike

我正在创建一个 Rails 库应用程序,其中流派 has_many书和一本书belongs_to一种流派。我需要使用表单对象,因为我的数据模型最终会有多个多对多关系,并且因为我想学习如何使用表单对象。我的表单对象基于 Rails Cast #416 表单对象。我的表单、表单对象、模型和 Controller 似乎都可以工作。新书被创建并且它们与流派相关联,但它们都是流派“流派”。我正在使用 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

模型流派.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

book_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:定义类型
=> 28:绑定(bind).pry
29:@流派||=流派.find_or_initialize_by(名称::名称)
30: #@genre ||= Genre.find_or_initialize_by(name: params[:genre][:name])
31:结束

最佳答案

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

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它接受哈希。

我会在 book params 上考虑同样的问题,但如果 slice 工作得很好。

另外,既然你调用 Genre.all在您的表单 View 中,您可能不需要在 Controller 操作中执行此操作,但如果您这样做,请考虑使用对象 @genres在您的表单 View 中 collection_select而是因为您在模型上提出了两次 all 请求。
@genres = Genre.all

关于ruby-on-rails - 使用带有表单对象的 Rails find_or_create_by,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35352937/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com