用Rails加入两个模型

时间:2016-06-12 23:32:56

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

我目前拥有Subscriber模型和Comment模型。 Subscriber has_many commentscomment belongs_to Subscriber。我想要的是订阅者能够在文本字段中发表评论,并且该评论通过id属于该订阅者。出于某种原因,我无法弄清楚这一点,我很难获得帮助。所以,非常清楚我在subscriber_id模型上有comment,如何将它们连接在一起以便我可以在Rails控制台中进行此调用 - @comment = @subscriber.comments.first并查看第一个属于该特定订阅者的评论?为清晰起见,我会展示一些代码。

SCHEMA:

         create_table "comments", force: :cascade do |t|
t.string   "description"
t.datetime "created_at",    null: false
t.datetime "updated_at",    null: false
t.string   "fav_drink"
t.string   "visit_time"
t.integer  "subscriber_id"
end

create_table "subscribers", force: :cascade do |t|
t.string   "first_name"
t.string   "last_name"
t.string   "email"
t.string   "phone_number"
t.string   "birthdate"
t.string   "street_1"
t.string   "street_2"
t.string   "city"
t.string   "zip"
t.string   "state"
t.datetime "created_at",   null: false
t.datetime "updated_at",   null: false
t.integer  "visit"
end

控制器:

class CommentsController < ApplicationController
def new
  @comment = Comment.new
end

def create
  @comment = Comment.create(comments_params)
  if @comment.save
    flash[:notice] = "Thank you!"
    redirect_to subscribers_search_path(:comments)
  else
    render "new"
  end
end

private

def comments_params
  params.require(:comment).permit(:fav_drink, :subscriber_id)
end
end



class SubscribersController < ApplicationController
 def index
  @subscriber = Subscriber.all
 end

 def new
  @subscriber = Subscriber.new
end

def create
  @subscriber = Subscriber.create(subscriber_params)
  if @subscriber.save
    flash[:notice] = "Subscriber Has Been Successfully Created"
    redirect_to new_subscriber_path(:subscriber)
  else
    render "new"
  end
end

模型如介绍中所述。谢谢!

2 个答案:

答案 0 :(得分:0)

有几种方法可以解决这个问题。我在下面突出显示3:

  1. 使用嵌套资源路由,例如:

    资源:订阅者   资源:评论 端

  2. 使用此方法,您的路线将成为订阅者/ 1 /评论...并且在您的comments_controller中,您可以从params[:subscriber_id]

    获取订阅者
    1. 如果订阅者是current_user,您也可以在comments_controller中设置它:

      current_user.comments.create(comments_params)

    2. 使用comments/form中的隐藏字段设置订阅者。

    3. 基本上,查看您的comments_params,您需要subscriber_id,而create/new未传递给控制器​​。所以你需要一种传递方式。

      您可以在@subscriber.comments.[create|new]操作之前设置订阅者,然后执行:

      new然后在f.hidden_field :subscriber_id评论表单视图中,您将{{1}}

      如果有效,请告诉我。

答案 1 :(得分:0)

有多种方法:

方法1:使用current_user / logged_in用户

如果订户据称已登录系统, 如果current_user是对logged_in的引用 订阅者,然后您可以将current_user分配给 在创建之前发表评论。

class CommentsController < ApplicationController
  def new
    @comment = Comment.new
  end

  def create
    @comment = current_user.comments.build(comments_params)

    if @comment.save
      flash[:notice] = "Thank you!"
      redirect_to subscribers_search_path(:comments)
    else
      render "new"
    end
  end

  private

  def comments_params
    params.require(:comment).permit(:fav_drink)
  end
end

方法2:隐藏字段

在评论表单中设置subscriber_id hidden_​​field然后 您现有的实施应该可以正常工作只是为了澄清 我正在复制/粘贴您的实施。

class CommentsController < ApplicationController
  def new
    @comment = Comment.new
  end

  def create
    @comment = Comment.new(comments_params)

    if @comment.save
      flash[:notice] = "Thank you!"
      redirect_to subscribers_search_path(:comments)
    else
      render "new"
    end
  end

  private

  def comments_params
    params.require(:comment).permit(:fav_drink, :subscriber_id)
  end
end

方法3:嵌套资源

使用rails嵌套资源,将路线设置为以下内容:

resources :subscribers
  resources: comments, only: [:new, :create]
end

然后将控制器代码更新为以下内容:

class CommentsController < ApplicationController
  def new
    @comment = Comment.new
  end

  def create
    @subscriber = Subscriber.find(params[:subscriber_id])
    @comment = @subscriber.comments.build(comments_params)

    if @comment.save
      flash[:notice] = "Thank you!"
      redirect_to subscribers_search_path(:comments)
    else
      render "new"
    end
  end

  private

  def comments_params
    params.require(:comment).permit(:fav_drink)
  end
end  
相关问题