2013-11-21 24 views
0

我正在嘗試做用戶評論,當用戶可以向其他用戶發表評論時,我創建了表格評論:content,user_reviews與:for_user_id和by_user_id, 我的路線rails 4沒有數據正在傳輸到db

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 %> 

所有的工作,但沒有數據發送到DB:\我做錯了嗎?

回答

0

有一個錯誤在控制器中,筆者認爲:

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

你是爲current_user而不是@user創建新Review秒。

+0

沒了,仍然不會保存任何東西。 – sevenseacat

+0

我錯過了包括'save'方法,我的不好。答案已更新。 – marzapower

+0

它工作,但軌道不發送數據到連接表,users_review – Adyl

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行。我上面的方法包含了這個改變。

+0

是的,我發現了這個錯誤,但是當我解決這個問題時,Rails將數據發送到審查表,並且不發送數據給users_review ... users_review爲空 – Adyl

+0

請參閱我的編輯。您將需要執行'@ user.save'來創建關聯。請參閱:http://stackoverflow.com/questions/12654040/rails-create-through-record-via-association – CDub

+1

因爲他使用'<%= form_for([@ user,@ user.reviews.build])do | f | %>'與一個特定的用戶,我懷疑真正的目標是'current_user'。這將是嵌套資源路線的濫用。 – marzapower

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解釋建設和創造之間的區別。

+0

是的,我發現這個錯誤,但是當我修復該問題時,rails將數據發送到審查表,並且不發送數據給users_review ... users_review爲空 – Adyl

1

我想你錯過了兩件事。用戶和評論類都需要參考他們在通過關係聘請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 

如上所述,在創建動作似乎有點迷茫。一般來說,這些參數應該與在新創建活動中創建實例相同,但您有一些區別。您可以通過以下兩種方式之一來解決此問題。一種選擇是在控制器中解決它。

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 %> 

我會傾向像第一個選項

+0

謝謝,但現在軌道給錯誤評論控制器中的ActiveRecord :: UnknownAttributeError#創建未知的屬性:for_user_id @review = @ user.reviews.create(params [:review] .merge(for_user_id:params [:for_user_id]))我認爲我所有的問題都在db中,在users_review中用for_user_id和by_user_id – Adyl

+0

我只能從你的帖子中推斷出這麼多,所以我只是試圖讓新的和創建的行動達成一致。如果在Review模型中有by_user_id和for_user_id,那麼讓我們更新User模型以反映這一點。 – AndyV