rails 4没有数据传输到db

时间:2013-11-21 14:59:23

标签: ruby-on-rails ruby ruby-on-rails-4

我正在尝试进行用户评论,当用户可以将评论写入其他用户时,我创建表评论:content,user_reviews with:for_user_id和by_user_id, 我的路线

devise_for :users
  resources :users, :only => [:show] do
    resources :reviews
  end

class Review < ActiveRecord::Base
    belongs_to :user
    has_many :users, :through => :users_reviews
end

class User < ActiveRecord::Base

  has_many :users_review
  has_many :reviews, :through => :users_review
end

class UsersReview < ActiveRecord::Base
  belongs_to :user
  belongs_to :review
end

class ReviewsController < ApplicationController

    def new
        @user = User.find(params[:user_id])
        @review = @user.reviews.new(params[:for_user_id])
    end

    def create
        @user = User.find(params[:id])
        @review = current_user.reviews.build(review_params)
        redirect_to root_path
    end

    def show
    end

    def index
        @user = User.find(params[:for_user_id])
        @reviews = Review.all
    end

    private
    def review_params
        params.require(:review).permit(:user_id, :user_id, :content)
    end

end

和我的观点

<%= form_for([@user, @user.reviews.build]) do |f| %>
<%= f.text_area :content, placeholder: "Your review" %>
<%= f.submit "Go", class: "btn btn-large btn-primary" %>
<% end %>

所有工作,但没有数据发送到数据库:\我做错了什么?

4 个答案:

答案 0 :(得分:3)

您没有在create方法中保存任何内容,因此不会有任何内容持续存在。

你会想要这样的东西:

def create
  @user = User.find(params[:id])
  @review = @user.reviews.build(review_params)

  if @user.save && @review.save
    redirect_to root_path
  else
    (handle bad data)
  end
end

我也倾向于同意@marzapower - 如果你想使用current_user,则不需要@review以上的行。我的上述方法包括此更改。

答案 1 :(得分:2)

您在save操作中错过了对create方法的调用:

def create
     @user = User.find(params[:id])
     @review = current_user.reviews.build(review_params)
     @review.save
     redirect_to root_path
end

这个post解释了构建和创建之间的区别。

答案 2 :(得分:1)

我认为你错过了两件事。 User和Review类都需要引用它们在直通关系中使用的UserReview类,例如

class User < ActiveRecord::Base
  ...
  has_many :user_reviews_received, class_name: 'UserReview', foreign_key: :for_user_id
  has_many :reviews_received, through: :user_reviews_received, class_name: 'Review'

  has_many :user_reviews_written,  class_name: 'UserReview', foreign_key: :by_user_id
  has_many :reviews_written, through: :user_reviews_written, class_name: 'Review'
  ...
end

如上所述,创建动作似乎有点混乱。一般来说,params应该在新建一个实例和创建动作时相同但你有一些差异。您可以通过以下两种方式之一解决此问题。一种选择是在控制器中解决它。

class ReviewsController < ActionController::Base
  def new
    @user = User.find(params[:user_id])
    @review = @user.reviews_received.new(by_user_id: current_user.id)
  end

  def create
    @review = @user.reviews_received.create(params[:review].merge(by_user_id: current_user.id))
    redirect_to root_path
  end
end

第二个选项是在视图中解析它(表单中的新第一行)。

<%= form_for([@user, @user.reviews_received.build(by_user_id: current_user.id)]) do |f| %>
  <%= f.hidden_field :by_user_id %>
  <%= f.text_area :content, placeholder: "Your review" %>
  <%= f.submit "Go", class: "btn btn-large btn-primary" %>
<% end %>

我会倾向于像第一个选项

答案 3 :(得分:0)

控制器出现错误,我认为:

def create
    @user = User.find(params[:id])
    @review = @user.reviews.build(review_params)
    @review.save
    redirect_to root_path
end

您为Review而不是current_user创建了新的@user