将逗号分隔值作为参数传递给rails中的控制器

时间:2015-06-26 13:31:27

标签: ruby-on-rails

在rails应用程序中,textarea具有逗号分隔值并保存表单。我想将逗号分隔值的计数保存到数据库而不是整个字符串。怎么算这个。 视图中的文本区域是:

<%= f.text_area :sent_to %>

传递给控制器​​的参数是:

 Parameters: {"utf8"=>"✓", "authenticity_token"=>"ag8WL59Swqo1TOFYfMOAC55VgoIxGSkleMXFDhUXYhO91zcPngas26MbpvMMyydNPSYntCfjAvKSh2R0TdQtbA==", "message_text"=>"    ", "sms_type"=>"true", "staff_type"=>"Teaching", "message"=>{"sent_to"=>"34434343243, 7869851872", "organization_id"=>"4"}, "contact_nos"=>["34434343243, 7869851872"], "contact_no"=>["34434343243", "7869851872"]}

现在控制器有message_params动作

 def message_params
      params.require(:message).permit(:message_text, :sent_to, :no_of_message, :organization_id)
    end

以下是保存数据的创建操作

def create
    @message = Message.new(message_params)

    respond_to do |format|
      if @message.save
        format.html { redirect_to @message, notice: 'Message was successfully created.' }
        format.json { render :show, status: :created, location: @message }
      else
        format.html { render :new }
        format.json { render json: @message.errors, status: :unprocessable_entity }
      end
    end
  end

谢谢大家的回答,问题解决了,还有一件事我希望staff_type存储在sent_to中。为此,我做了,但它没有奏效。 @ message.sent_to = message_params [:message_text] [:staff_type]

5 个答案:

答案 0 :(得分:2)

你可以做到

def create
    @message = Message.new(message_params)
    @message.sent_to = @message.sent_to.try(:split,",").try(:count)
end

<强>更新

根据您的评论我想,您想要将sent_to次和staff_type保存在相同的属性sent_to中?

您一次只能保存一个,或者您必须序列化该属性,并且可以将sent_tostaff_type保存为对象。但是如果使用sent_to的搜索查询太多,则不建议使用序列化列。

如果您想单独保存staff_type,则应使用

@message.sent_to = params[:staff_type]

答案 1 :(得分:0)

这应该有用。

sent_to_count = message_params[:message][:sent_to].split(",").count

答案 2 :(得分:0)

试试这个

count = params[:message]['sent_to'].split(",").count

希望这对你有用。

答案 3 :(得分:0)

您不应该在控制器中执行此类操作。更标准的方法是在模型中执行此操作。创建一个before validation回调方法,并将其附加到其原点附加计数。通过这种方式,您可以在从不同级别的URL更新相同操作时担心。

更新您的参数权限:

before_validation: :append_send_to_count

def append_send_to_count
    if sent_to.present? and sent_to_changed?
       seld.sent_to_count = sent_to.split(',').size
    end
end

答案 4 :(得分:0)

存储其他值以及sent_to

        number_array=params[:message][:sent_to]
        @final_array=[]
        number_array.split(",").flatten.compact.each do |number|
          @final_array << {:number => number, :staff_type => message_params[:message_text][:staff_type]}
          ##something like @final_array[0] will give
          ##{:123456=>123456,:staff_type=>Teaching}
          ##@final_array[0][:12345] will give 12345
          ##@final_array[0][:staff_type] will give "Teaching"
        end