Rails Mass Assignment - 如何解决这个问题

时间:2013-05-27 00:34:06

标签: ruby-on-rails-3

我有一个receiver_id和sender_id,我通过隐藏的表单字段获取。这些属性是attr_accessible,因此它们是可批量分配的。但是,我不希望它受到大规模的任命。如何在不必使用隐藏的表单字段并使接收者和发件人ID为attr_accessible的情况下进行此操作?

控制器

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

1 个答案:

答案 0 :(得分: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

您当然需要创建一些方法来确定用户是否可以发送到该接收器。在这一点上,你的行动变得非常复杂,我会重构这一切,以便从你的控制器行动中取出它。