Rails: 基于另一个模型控制器中的参数创建新模型
Rails: Creating new model based on a parameter in another model's controller
我正在尝试创建一个模型,其中每个博客 post 都有许多关联的标签(一个单独的模型)。在我的表单中,我传回了一个单独的标签字符串以及 post,例如 "apples,oranges,bananas"。我最终会尝试拆分这个字符串,然后为每个字符串创建一个标签。然而,现在我只是想看看我是否可以用整个字符串制作一个标签。
请求由 posts 控制器的创建方法处理。但是,我不知道如何在 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
用于 posts 控制器。它创建了 post,但似乎并没有实际保存 @tag
无需深入,我看到您的代码中有以下行(在 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
)
这一行
Tag.new = @post.tags.create(post_params[:tag_name])
没有意义。无需进一步讨论:
@post.tags.create(post_params[:tag_name])
将起作用并实际创建标签。
我正在尝试创建一个模型,其中每个博客 post 都有许多关联的标签(一个单独的模型)。在我的表单中,我传回了一个单独的标签字符串以及 post,例如 "apples,oranges,bananas"。我最终会尝试拆分这个字符串,然后为每个字符串创建一个标签。然而,现在我只是想看看我是否可以用整个字符串制作一个标签。
请求由 posts 控制器的创建方法处理。但是,我不知道如何在 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
用于 posts 控制器。它创建了 post,但似乎并没有实际保存 @tag
无需深入,我看到您的代码中有以下行(在 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
)
这一行
Tag.new = @post.tags.create(post_params[:tag_name])
没有意义。无需进一步讨论:
@post.tags.create(post_params[:tag_name])
将起作用并实际创建标签。