1

試圖找出一個更好的方式來分配審查它是相關的模型。Rails創建多個動作belongs_to

我有以下類別:

class User < ActiveRecord::Base 
    has_many :reviews, dependent: :destroy 
end 

class Review < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :restaurant 
end 

class Restaurant < ActiveRecord::Base 
    has_many :reviews, dependent: :destroy 
end 

非常簡單的東西。評論必須有餐廳和用戶。我創建操作是這樣的:

def create 
    @restaurant = Restaurant.find(params[:restaurant_id]) 
    @review = @restaurant.reviews.build(review_params) 
    @review.user = current_user 

    if @review.save 
     redirect_to @restaurant 
    else 
     render 'new' 
    end 
    end 

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

目前我建審查的餐廳,然後我給你審查的用戶將當前用戶。

這一切工作正常,但有一個更清潔的方式來建立協會? 有沒有辦法在強壯的參數旁邊添加額外的參數到構建方法?

我看着accep_nested_attributes_for,但我無法讓它工作。

謝謝!

回答

2

您可以使用mergereview_params like below

def review_params 
    params.require(:review).permit(:content).merge(user_id: current_user.id) 
end 

這樣你就可以在create方法中刪除這條線@review.user = current_user

+1

這正是我所期待的。謝謝 – Jshoe523

0

在你的表格,你可以把一個隱藏字段與user_id要分配:

<%= f.hidden_field :user_id, value: @user.id %> 

然後,把它添加到您的review_params

params.require(:review).permit(:content, :user_id) 
+0

我想過使用隱藏字段,但是我不想包含敏感信息,比如用戶的id。我的理解是,惡意用戶仍然可以改變價值。還有其他的選擇嗎? – Jshoe523

+0

那麼,你只會在表單頁面上顯示'user_id'。並且僅限於登錄的用戶。所以我看不到你的'user_id',除非我已經登錄過你。是的,我可以改變隱藏字段的值,但是我不得不猜測一個id或者已經知道一個id。 –

+0

另一種方法是在用戶模型中爲超級密碼(例如,隨機10-20位數字)設置一個字段。它不會像Active Record ID那樣順序,所以有人猜測會更困難。 –

相關問題