2013-05-27 30 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