Rails:根据另一个模型控制器中的参数创建新模型

时间:2015-07-12 05:43:50

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord

我正在尝试创建一个模型,其中每个博客帖子都有许多与之关联的标签(单独的模型)。在我的表格中,我传回一个分开的标签串和帖子,如“苹果,橘子,香蕉”。我最终将尝试拆分此字符串,然后为每个字符串创建一个标记。但是,现在我只是想看看我是否可以用整个字符串制作一个标签。

请求由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

2 个答案:

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

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