nil的未定义方法`merge':使用text_field_tag的表单中的NilClass

时间:2012-02-25 07:08:22

标签: ruby-on-rails

我正在关注this教程为模型创建标签(在我的例子中是模型Post):

控制器/ posts_controller.rb:

  def create
    @user = current_user
    @post = @user.posts.new(params[:post])

    if @post.save
      redirect_to @post, notice: 'post was successfully created.'
    else
      render action: "new"
    end

    @post.tag!(params[:tags])
  end

视图/帖/ _form.html.erb:

<%= form_for(@post) do |f| %>
  <%= render 'shared/error_messages' %>
  <div class="field">
    <%= f.label :title %><br />
    <%= f.text_field :title %>
  </div>
  <div class="field">
    <%= f.label :content %><br />
    <%= f.text_area :content %>
  </div>
  <div class="field">
    <%= f.label :tags %>
    <%= f.text_field :tags, params[:tags] %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>

视图/帖/ show.hmtl.erb:

<div class="tags">
  <h4>Tags:</h4>
  <%= render @post.tags %>
</div>

模型/ post.rb:

class Post < ActiveRecord::Base
  has_and_belongs_to_many :tags

  def tag!(tags)
    tags = tags.split(" ").map do |tag|
      Tag.find_or_create_by_name(tag)
    end
    self.tags << tags
  end
end

模型/ tag.rb:

class Tag < ActiveRecord::Base
  has_and_belongs_to_many :posts
end

分贝/迁移/(等...)_ create_tags.rb:

class CreateTags < ActiveRecord::Migration
  def change
    create_table :tags do |t|
      t.string :name
    end

    create_table :tags_posts, :id => false do | t |
      t.integer :tag_id, :post_id
    end
  end
end

现在,当我访问帖子表单时,我收到此错误:

undefined method `merge' for nil:NilClass
Extracted source (around line #13):

10:   </div>
11:   <div class="field">
12:     <%= f.label :tags %>
13:     <%= f.text_field :tags, params[:tags] %>
14:   </div>
15:   <div class="actions">
16:     <%= f.submit %>

当我访问帖子时,我收到此错误:

SQLite3::SQLException: no such table: posts_tags: SELECT "tags".* FROM "tags" INNER JOIN "posts_tags" ON "tags"."id" = "posts_tags"."tag_id" WHERE "posts_tags"."post_id" = 7
Extracted source (around line #24):

21: 
22:     <div class="tags">
23:       <h4>Tags:</h4>
24:       <%= render @post.tags %>
25:     </div>
26: 
27:   </div>

但是我可以在 schema.rb 文件中看到这些表:

 create_table "tags", :force => true do |t|
    t.string "name"
  end

  create_table "tags_posts", :id => false, :force => true do |t|
    t.integer "tag_id"
    t.integer "post_id"
  end

有任何解决此问题的建议吗?

4 个答案:

答案 0 :(得分:2)

你有一个向后的表名。 HABTM按字母顺序查找模型。仔细看看错误。它说无法找到posts_tags。您创建tags_posts。所以将表名更改为posts_tags。

答案 1 :(得分:2)

以防其他人通过谷歌遇到这个老问题: 您需要使用&#39; value:&#39;以简单形式显示默认值。

  <%= f.text_field :tags, value: params[:tags] %>

答案 2 :(得分:1)

在您的部分_form.html.erb中尝试此<%= f.text_field_tag :tags, params[:tags] %>

答案 3 :(得分:0)

<%= form_with(
  url: order_register_path(session[:order_id]),
  method: :put
) do |form| %>
  <%= form.check_box :review_budget %>
  <%= form.check_box :fast_delivery %>
  <%= form.check_box :replace_similar %>

  <div>
    <%= f.submit "Continuar" %>
  </div>
<% end %>

f.submit而不是那个submit_tag