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:\\\\\\\\我做错了什么?
您没有在
您将需要以下内容:
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-如果要使用
您在
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 |
您正在为