我正在尝试创建一个模型,其中每个博客帖子都有许多与之关联的标签(单独的模型)。在我的表格中,我传回一个分开的标签串和帖子,如“苹果,橘子,香蕉”。我最终将尝试拆分此字符串,然后为每个字符串创建一个标记。但是,现在我只是想看看我是否可以用整个字符串制作一个标签。
请求由posts控制器的create方法处理。但是,我无法弄清楚如何在posts控制器中创建和提交标记,或者至少调用标记控制器来委派创建。我收到错误:
undefined method `new=' for Tag(id: integer, tag_name: string, post_id: integer):Class
这指向posts_controller的Tag.new = @ post.tags.create(post_params [:tag_name])。
相关代码:
posts_controller
def new
@post = Post.new
end
def create
@post = current_user.posts.create(post_params)
Tag.new = @post.tags.create(post_params[:tag_name])
if @post.save
redirect_to post_path(@post), :notice => "Post was created successfully."
else
render :new
end
end
private
def post_params
params.require(:post).permit(:title, :content_md, :image, :user_id, :year_created, :medium, :dimension_height, :dimension_width, :measurement, :weight_in_pounds, :price, :quantity)
end
tags_controller
class TagsController < ApplicationController
def new
@tag = Tag.new
end
def create
@tag = tag.create(tag_params)
end
private
def tag_params
params.require().permit(:tag_name, :user_id)
end
end
post.rb
class Post < ActiveRecord::Base
# Relations
belongs_to :user
has_many :comments
has_many :post_votes
has_many :tags
accepts_nested_attributes_for :tags
end
tag.rb
class Tag < ActiveRecord::Base
validates :tag_name, presence: true
validates :post_id, presence: true
belongs_to :post
end
编辑:
也尝试过:
def create
@tag = Tag.new(post_params[:tag_name])
@tag.save
@post = current_user.posts.create(post_params)
# @post.tags.create(post_params[:tag_name])
if @post.save
redirect_to post_path(@post), :notice => "Post was created successfully."
else
render :new
end
end
用于帖子控制器。它创建了帖子,但似乎并没有实际保存@tag
答案 0 :(得分:1)
如果不深入,我会在你的代码中看到你的下一行(在posts_controller中)
Tag.new = @post.tags.create(post_params[:tag_name])
这是不正确的。如果你想创建(但不坚持),你应该打电话,
@post.tags.new(post_params[:tag_name])
坚持
@post.tags.create(post_params[:tag_name])
这将消除您发布的错误。但是,您不应该要求这些,因为您的Post
模型可以接受标记的嵌套属性。只需确保您已正确生成表单(提示:fields_for
)
答案 1 :(得分:1)
这一行
Tag.new = @post.tags.create(post_params[:tag_name])
毫无意义。没有进一步的讨论:
@post.tags.create(post_params[:tag_name])
将起作用并实际创建标记。