0

我有一个接收者 ID 和发送者 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 %>
4

1 回答 1

1

是的,这类似于我想象的您的设置。

所以你想sender_id成为当前用户的 id。

所以你应该有:

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

那么这并不重要,receiver_id因为分配接收器没有问题。

看来您也对限制 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

您当然需要创建一些方法来确定用户是否可以发送到该接收者。在这一点上,您的操作变得非常复杂,我将重构整个事情以将其从您的控制器操作中移除。

于 2013-05-27T06:45:27.453 回答