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