如何将记录添加到链接表?

stackov8

请帮助解决问题。

楷模:

class Tag < ActiveRecord::Base
  has_and_belongs_to_many :posts
end

class Post < ActiveRecord::Base
  belongs_to  :user
  has_and_belongs_to_many :tags
end

表格:

create_table "posts", force: :cascade do |t|
  t.string   "title"
  t.text     "body"
  t.integer  "user_id"
end

create_table "posts_tags", id: false, force: :cascade do |t|
  t.integer "post_id"
  t.integer "tag_id"
end

create_table "tags", force: :cascade do |t|
  t.string   "tagname"
end  

形式:

<%= form_for [@user, @post] do |f| %>
      <%= f.label :title %>
      <%= f.text_field :title %>

      <%= f.label :body %>
      <%= f.text_area :body %>

      <label class="lbl_tagname"><%=t :tags %></label>
      <%= text_field_tag 'tagnames', nil, class: 'tagnames' %>

      <%= f.submit %>
<% end %>

后控制器:

def new    
  @user = User.find(params[:user_id])
  @post = Post.new
end

def create  
  @post = current_user.posts.build(post_params)

  if @post.save
    add_new_tags(@post)
    flash[:success] = t :post_saved
    redirect_to user_post_path(@current_user, @post)
  else
    flash.now[:error] = t :post_not_saved
    render 'new'
  end
end

private
  def add_new_tags(post)
    tagnames = params[:tagnames].split(/[, \.?!]+/) 

    tagnames.each do |tagname|
      tagname_exist = Tag.find_by tagname: tagname.downcase
      tag = Tag.create(tagname: tagname.downcase) if !tagname_exist

      tag.posts.push post
      p '=============='
      p post.id
      p '=============='
    end
  end

  def post_params
    params.require(:post).permit(:title, :body, :tagnames)
  end

用户访问页面,请参阅表单。填写下面的表格。发送。结果记录未添加到表posts_tags中。

显示以下错误消息:

NoMethodError in PostsController#create
undefined method `posts' for nil:NilClass

控制台显示以下内容:

"=============="
391
"=============="
  Tag Load (0.1ms)  SELECT  "tags".* FROM "tags" WHERE "tags"."tagname" = ? LIMIT 1  [["tagname", "asd"]]
Completed 500 Internal Server Error in 904ms (ActiveRecord: 811.8ms)

NoMethodError (undefined method `posts' for nil:NilClass):
  app/controllers/posts_controller.rb:93:in `block in add_new_tags'
  app/controllers/posts_controller.rb:89:in `each'
  app/controllers/posts_controller.rb:89:in `add_new_tags'
  app/controllers/posts_controller.rb:45:in `create'

其中。在表中的帖子条目已创建

瓦鲁沙里·帕瓦尔
def add_new_tags(post)
    tagnames = params[:tagnames].split(/[, \.?!]+/)    
    tagnames.each do |tagname|
      tag = Tag.find_or_create_by(tagname: tagname.downcase)
      tag.posts << post
    end
  end

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章