【问题标题】:Unpermitted parameters: author不允许的参数:作者
【发布时间】:2015-07-02 20:58:30
【问题描述】:

我的要求 基本上我正在将书籍添加到数据库中,并且我想将作者存储在单独的表中。所以我有一个名为 authors 的表,被表书引用。

我想创建一个 Rails 表单来添加一本书,我希望它只是一个简单的表单,用于作者、标题、出版商等,如果它发现作者已经在作者表中,那么它应该只是引用该记录,如果它不在 authors 表中,则应添加一条新记录并引用它。

在存储值时,我在日志文件中获取 不允许的参数:作者

Processing by BooksController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"8sxeOVMVJucl5nN+kMpSaT1cB1yDPnk5gfKElWPiT5k=", "book"=>{"book_name"=>"life ", "price"=>"20", "author"=>{"author_name"=>"swamy", "title"=>"LIFE", "publisher"=>"cta"}}, "commit"=>"Submit"}

swamy
LIFE
cta
  Author Load (1.6ms)  SELECT  "authors".* FROM "authors"  WHERE "authors"."author_name" = 'swamy' AND "authors"."title" = 'LIFE' AND "authors"."publisher" = 'cta' LIMIT 1
   (0.6ms)  BEGIN
  SQL (25.2ms)  INSERT INTO "authors" ("author_name", "created_at", "publisher", "title", "updated_at") VALUES ($1, $2, $3, $4, $5) RETURNING "id"  [["author_name", "swamy"], ["created_at", "2015-07-01 03:53:22.712401"], ["publisher", "cta"], ["title", "LIFE"], ["updated_at", "2015-07-01 03:53:22.712401"]]
   (16.8ms)  COMMIT
Unpermitted parameters: author
   (0.7ms)  BEGIN
  SQL (1.0ms)  INSERT INTO "books" ("Author_id", "book_name", "created_at", "price", "updated_at") VALUES ($1, $2, $3, $4, $5) RETURNING "id"  [["Author_id", 8], ["book_name", "life "], ["created_at", "2015-07-01 03:53:22.865106"], ["price", 20], ["updated_at", "2015-07-01 03:53:22.865106"]]
   (22.4ms)  COMMIT

我的代码 books_Controller

class BooksController < ApplicationController
  def new

  end
 def create

  @a=params[:author_name]
  puts @a
  b=params[:book][:author][:author_name]
  puts b
#   @c = @b.authors
#   @d = @c.author_name
   c=params[:book][:author][:title]
        d=params[:book][:author][:publisher]

  puts c
   puts d
   @author = Author.find_or_create_by(author_name: b,title: c, publisher: d)
   @book = Book.new(books_params)
   @book.Author = @author  
   @book.save 
  redirect_to root_url

 end
private

  def books_params
     params.require(:book).permit(:book_name, :price,:author_attributes => [:author_name, :title, :publisher])
end 
end 

型号

class Author < ActiveRecord::Base

end

class Book < ActiveRecord::Base
  belongs_to :Author
  accepts_nested_attributes_for :Author
 # def author_name=(author_name)
  #  self.author = Author.find_or_create_by_name author_name
  #end
end

查看 book.html.erb

<%= form_for Book.new  do |f| %>

  <p>
    <%= f.label :book_name %><br />
    <%= f.text_field :book_name %>
  </p>
  <p>
    <%= f.label :price %><br />
    <%= f.text_field :price %>
  </p>

  <%= f.fields_for :author do |b| %>
     <p>
    <%= b.label :author_name%><br />
    <%= b.text_field :author_name %>
  </p>
<p>
    <%= b.label :title%><br />
    <%= b.text_field :title %>
  </p>
<p>
    <%= b.label :publisher%><br />
    <%= b.text_field :publisher%>
  </p>

  <% end %>
  <p><%= f.submit "Submit" %></p>
<% end %>
~         

嗨,先生,我是 Rails 新手,我知道它看起来很简单,但我找不到解决方案

~
~

【问题讨论】:

    标签: ruby-on-rails ruby postgresql


    【解决方案1】:

    那是因为你的books_paramsauthor_attributes 根据你的参数应该是author

    这应该可行:

    def books_params
      params.require(:book).permit(:book_name, :price, :author => [:author_name, :title, :publisher])
    end 
    

    【讨论】:

    • 感谢您的回复,但我编辑了上面的代码,但我得到了未知属性:@book = Book.new(books_params) 中的作者错误
    【解决方案2】:

    您的代码充满了错误。跟随我的变化。

    #book.rb
    class Book < ActiveRecord::Base
      belongs_to :author
      accepts_nested_attributes_for :author
    end
    
    #books_controller.rb
    def new
    @book = Book.new
    @book.build_author
    end
    
    def create
    @book = Book.new(books_params)
     if @book.save 
       redirect_to root_url
     end
    end
    

    最后在您的表单中将&lt;%= form_for Book.new do |f| %&gt; 更改为&lt;%= form_for @book do |f| %&gt;

    【讨论】:

    • 谢谢先生,但是只有书籍值存储在数据库中,而作者表的值为零,您能否解释一下在检查作者是否已经存在后如何将数据存储到作者表中
    【解决方案3】:

    在视图文件中将authore 更改为author_attributes,如下所示。

     <%= f.fields_for :author_attributes do |b| %>
      <p>
       <%= b.label :author_name%><br />
       <%= b.text_field :author_name %>
      </p>
    

    也分别在控制器中更改。我想,这样就够了。

    def create
      @book = Book.new(books_params) 
      @book.save 
      redirect_to root_url
    end
    

    【讨论】:

      【解决方案4】:

      我会建议你 debug 你的代码

      def books_params
      byebug
        params.require(:book).permit(:book_name, :price, :author => [:author_name, :title, :publisher])
      end 
      

      1:检查您的请求的参数

      2:请查看params.require(:book)

      请求的参数是这样的

        Parameters: {"utf8"=>"✓", "authenticity_token"=>"8sxeOVMVJucl5nN+kMpSaT1cB1yDPnk5gfKElWPiT5k=", "book"=>{"book_name"=>"life ", "price"=>"20", "author_"=>{"author_name"=>"swamy", "title"=>"LIFE", "publisher"=>"cta"}}, "commit"=>"Submit"}
      

      check with this link NestedAttributes

      你的控制器是这样的

      class BooksController < ApplicationController
        def new
        end
      
        def create
          @author = Author.create(params[:book])
          redirect_to root_url
        end
      
        private
      
        def books_params
          params.require(:book).permit(:book_name, :price,:author_attributes => [:author_name, :title, :publisher])
        end
      end 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多