2013-05-27 27 views
0

我有一個receiver_id和sender_id,我通過隱藏的表單字段。這些屬性是attr_accessible的,所以它們是可分配的。但是,我不希望它受到大規模分配。我怎麼去解決這個問題,而不必求助於隱藏的表單字段,並使接收者和發送者ID attr_accessible?Rails Mass Assignment - 如何去做這個

控制器

Class UsersController < ApplicationController 
def show 
    @user = User.find(params[:id]) 
    @first_name = @user.first_name 
    @last_name = @user.last_name 
    @wallpost = WallPost.new(params[:wall_post]) 
    @showwallposts = @user.received_wallposts 
end 

def create 
    @wallpost = WallPost.create(params[:wall_post]) 
end 

車型

class WallPost < ActiveRecord::Base 
    attr_accessible :content, :receiver_id, :sender_id 
    belongs_to :receiver, :class_name => "User", :foreign_key => "receiver_id" 
    belongs_to :sender, :class_name => "User", :foreign_key => "sender_id" 
end 


class User < ActiveRecord::Base 
has_many :sent_wallposts, :class_name => 'WallPost', :foreign_key => 'sender_id' 
has_many :received_wallposts, :class_name =>'WallPost', :foreign_key => 'receiver_id' 

視圖

<%= form_for(@wallpost, :url => {:action => 'create'}) do |f| %> 
     <%= f.hidden_field :receiver_id, :value => @user.id %> 
     <%= f.hidden_field :sender_id, :value => current_user.id %>  
     <%= f.text_area :content, :class => 'inputbox' %> 
     <%= f.submit 'Post', class: 'right btn' %>  
    <% end %> 
+0

不知道你的模型是什麼以及'receiver_id'和'sender_id'是什麼,很難說爲什麼你應該或不應該使用質量分配或最好的方式來做你想做的事情。根據名字,我猜你的擔心是安全的,並且有一條規則,只有當前用戶可以是'sender_id'。如果是這種情況,解決方案是不在表單中放置'sender_id',而只是從控制器中的當前用戶設置它。需要更多信息才能給出完整有用的答案。 –

+0

嗨,亞歷克斯。謝謝你的評論。我要編輯我的帖子以顯示更多信息。 – VPNTIME

+0

要添加到我的最新評論,我不希望它,因此用戶可以批量分配表單中的receiver_id和sender_id。 – VPNTIME

回答

1

是的,這類似於我想象你的設置可能是。

所以你想sender_id是當前用戶的ID。

所以,你應該有:

def create 
    @wallpost = current_user.sent_wallposts.create(params[:wall_post]) 
end 

它不那麼重要的是receiver_id被mass_assigned因爲沒有分配問題的接收器。

看來你也有興趣限制receiver_id。你可以這樣做,以及:

def create 
    receiver_id = params[:wall_post].delete(:receiver_id) 
    @wallpost = current_user.sent_wallposts.build(params[:wall_post]) 
    @wallpost.receiver_id = receiver_id 
    @wallpost.save 
end 

然而,這並沒有真正改變這種狀況,因爲在所有存在着質量和分配的值之間沒有什麼不同。您希望避免對該值進行批量分配的唯一原因是,您是否希望將用戶可以發送給其他用戶的其他邏輯放在適當位置。在這種情況下,它會是這樣的:

def create 
    receiver_id = params[:wall_post].delete(:receiver_id) 
    if current_user.can_send_to(receiver_id) 
    @wallpost = current_user.sent_wallposts.build(params[:wall_post]) 
    @wallpost.receiver_id = receiver_id 
    @wallpost.save 
    end 
end 

當然,你需要創建一些方法可以確定用戶可以發送到接收器。在這一點上,你的行爲變得非常複雜,我會重構這整個事情,從控制器動作中解脫出來。

+0

謝謝亞歷克斯。這就是我所想的。我只想弄清楚如何阻止接收器被質量分配。我想這是不可能的。再次感謝。 – VPNTIME

+1

有可能,我只是不明白你爲什麼想根據給出的信息來限制它。我會修改我的答案。 –

+0

謝謝亞歷克斯。你是對的。沒有必要限制它。但我很好奇,以防萬一我想要。我只是覺得這有點奇怪,允許用戶在技術上能夠通過修改receiver_id從另一個人的牆上張貼到人的牆上。我對Rails很陌生,而且我沒有真正閱讀過這本書。只是在線閱讀教程。我從你的帖子中學到了很多東西。 – VPNTIME