我正在尝试进行用户评论,当用户可以将评论写入其他用户时,我创建表评论: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 %>
所有工作,但没有数据发送到数据库:\我做错了什么?
答案 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
。