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])

将起作用并实际创建标签。