请帮助解决问题。
模型:
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'
其中。在表格中创建条目
答案 0 :(得分:1)
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
答案 1 :(得分:1)
只有在初始化post
变量
tag
推送到tag
tag = tagname_exist || Tag.create(tagname: tagname.downcase)
tag.posts.push post