我刚刚开始学习 Rails 并尝试制作我的第一个应用程序。 只是想知道是否可以使用这样的结构
<%= form_tag create_message_path, :method => :post do %>
<%= text_area_tag "message", nil %>
<%= hidden_field_tag "receiver", @order.printer.user.id %>
<%= hidden_field_tag "order_id", @order.id %>
<%= submit_tag "Submit" %>
<% end %>
和基本的强参数。
class MessagesController < ApplicationController
before_action :correct_user, only: [:update, :destroy]
def create
if current_user
@message = current_user.messages.build(message_params)
if @message.save
flash[:success] = "Сообщение создано"
redirect_to :back
else
redirect_to :back
end
else
redirect_to login_path
end
end
private
def message_params
params.permit(:message, :read, :receiver, :user_id, :printer_id, :order_id )
end
def correct_user
@message = current_user.messages.find_by(id: params[:id])
redirect_to root_url if @message.nil?
end
end
这不是线程吗?用户可以更改 html 输入值并发送一些信息(例如要发送给其他订单的消息)吗?
编辑 1:
@order = Order.find(params[:id])
message_item = {
user_id: current_user.id,
receiver: @order.printer.user.id,
message: params[:message],
order_id: @order.id
}
@message = current_user.messages.build(message_item)
最佳答案
首先,隐藏的参数是可以改变的,它们对任何敏感信息都不利。
其次,从您的 message_params 方法中删除这些参数。您不想在参数散列中允许它们(不应允许不在您的表单上的参数):
params.permit(:message, :read)
此外,您可能还想删除 :read,因为您很可能会在其他 Controller 操作中设置它。
第三,您通过赋值设置这些参数:
@message = current_user.messages.build(message_params)
@message.receiver = @order.printer.user.id
@message.order_id = @order.id
注意,你不需要写@message.user_id = current_user.id
因为它将由 Rails 为您完成。
关于ruby-on-rails - 在 Rails 4 中通过隐藏标签传递参数是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38383205/