关于ruby:rails 4没有数据正在传输到db

rails 4 no data is being transferred to db

我正在尝试进行用户审阅,当用户可以向另一个用户写审阅时,我创建具有:content的表审阅,具有:for_user_id的user_reviews和by_user_id的表审阅,
我的路线

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
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

和我的观点

1
2
3
4
<%= 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 %>

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


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

您将需要以下内容:

1
2
3
4
5
6
7
8
9
10
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上方的行。我上面的方法已包含此更改。


您在create操作中缺少对save方法的调用:

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

这篇文章解释了build和create之间的区别。


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

1
2
3
4
5
6
7
8
9
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

如上所述,create操作似乎有点混乱。一般来说,在新实例中创建实例和创建操作的参数应相同,但是会有一些不同。您可以通过以下两种方法之一来解决此问题。一种选择是在控制器中解决它。

1
2
3
4
5
6
7
8
9
10
11
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

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

1
2
3
4
5
<%= 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 %>

我倾向于第一种选择


我认为控制器中存在错误:

1
2
3
4
5
6
def create
    @user = User.find(params[:id])
    @review = @user.reviews.build(review_params)
    @review.save
    redirect_to root_path
end

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