Rails,X-Editable 未在 AJAX 调用中传递正确的参数
Rails, X-Editable not passing correct params in AJAX call
我已经看了 2 天了。我在 Rails 4.2.5 和 ruby 2.1.7 中有一个应用程序。
我正在尝试使用 X-Editable 实现内联编辑。
我没有使用任何 gem,只是导入相关文件:
<link href="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css" rel="stylesheet">
<script src="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/js/bootstrap.min.js"></script>
<!-- x-editable (bootstrap version) -->
<link href="//cdnjs.cloudflare.com/ajax/libs/x-editable/1.4.6/bootstrap- editable/css/bootstrap-editable.css" rel="stylesheet"/>
<script src="//cdnjs.cloudflare.com/ajax/libs/x-editable/1.4.6/bootstrap-editable/js/bootstrap-editable.min.js"></script>
在我看来我有:
<a href="#" class="editable bolbol editable-disabled" data-pk="1" id="amount" data-type="text" data-url="<%=crossingcost_path(crossingcost.id)%>" data-title="Enter Amount">
<%= crossingcost.amount %>
</a>
我正在用
初始化
// make amount editable
$('.bolbol').editable({
});
到目前为止一切顺利,我可以访问弹出窗口来编辑我要编辑的值。
然后我收到一条错误消息:
ParameterMissing (param is missing or the value is empty: crossingcost)
因此发送的参数哈希如下(来自日志):
参数:
{
"name" => "amount",
"value" => "166",
"pk" => 1,
"id" => "1"
}
而它可能会发送如下内容:
{
:crossingcost => {
"name" => "amount",
"value" => "166",
"pk" => 1,
"id" => "1"
}
}
关于如何发送正确的参数以便更新操作可以正常工作有什么想法吗?
EDIT1:添加控制器
# PATCH/PUT /crossingcosts/1
# PATCH/PUT /crossingcosts/1.json
def update
respond_to do |format|
if @crossingcost.update(crossingcost_params)
format.html { redirect_to @crossingcost, notice: 'Crossingcost was successfully updated.' }
format.json { render :show, status: :ok, location: @crossingcost }
else
format.html { render :edit }
format.json { render json: @crossingcost.errors, status: :unprocessable_entity }
end
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_crossingcost
@crossingcost = Crossingcost.find(params[:id])
end
def set_ticket
@ticket = Ticket.find(params[:ticket_id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def crossingcost_params
params.require(:crossingcost).permit(:ticket_id, :usermetum_id, :amount,:firm_id)
end
def crossingcost_params_nested
params.require(:mynested_crossingcost).permit(:ticket_id, :usermetum_id, :amount,:firm_id)
end
所以首先,我建议您使用 Rails HTML Helpers 而不是将 ERB 包装到您的 HTML 标签中。看起来有点乱:
<%= link_to '#', class: 'editable bolbol editable-disabled', data: { pk: '1', type: 'text', url: crossingcost_path(crossingpost.id), title: 'Enter Amount' }, id: 'amount' do %>
<%= crossingcost.amount %>
<% end %>
而不是
<a href="#" class="editable bolbol editable-disabled" data-pk="1" id="amount" data-type="text" data-url="<%=crossingcost_path(crossingcost.id)%>" data-title="Enter Amount">
<%= crossingcost.amount %>
</a>
关于你的其他问题:
如果我理解正确的话,我认为解决这个问题的最好方法是直接允许参数而不是试图嵌套它们。
例如:
def crossingcost_params
params.permit(:name, :value, :pk, :id)
end
通过这种方式,您可以允许未嵌套的参数。
就像你的例子一样:
{
"name" => "amount",
"value" => "166",
"pk" => 1,
"id" => "1"
}
我认为在X-editable
中嵌套这个参数应该也是可以的。如果你想通过这种方式解决问题,请查看Docs。
希望对您有所帮助!
编码愉快:)
我已经看了 2 天了。我在 Rails 4.2.5 和 ruby 2.1.7 中有一个应用程序。 我正在尝试使用 X-Editable 实现内联编辑。
我没有使用任何 gem,只是导入相关文件:
<link href="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css" rel="stylesheet">
<script src="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/js/bootstrap.min.js"></script>
<!-- x-editable (bootstrap version) -->
<link href="//cdnjs.cloudflare.com/ajax/libs/x-editable/1.4.6/bootstrap- editable/css/bootstrap-editable.css" rel="stylesheet"/>
<script src="//cdnjs.cloudflare.com/ajax/libs/x-editable/1.4.6/bootstrap-editable/js/bootstrap-editable.min.js"></script>
在我看来我有:
<a href="#" class="editable bolbol editable-disabled" data-pk="1" id="amount" data-type="text" data-url="<%=crossingcost_path(crossingcost.id)%>" data-title="Enter Amount">
<%= crossingcost.amount %>
</a>
我正在用
初始化// make amount editable
$('.bolbol').editable({
});
到目前为止一切顺利,我可以访问弹出窗口来编辑我要编辑的值。
然后我收到一条错误消息:
ParameterMissing (param is missing or the value is empty: crossingcost)
因此发送的参数哈希如下(来自日志):
参数:
{
"name" => "amount",
"value" => "166",
"pk" => 1,
"id" => "1"
}
而它可能会发送如下内容:
{
:crossingcost => {
"name" => "amount",
"value" => "166",
"pk" => 1,
"id" => "1"
}
}
关于如何发送正确的参数以便更新操作可以正常工作有什么想法吗?
EDIT1:添加控制器
# PATCH/PUT /crossingcosts/1
# PATCH/PUT /crossingcosts/1.json
def update
respond_to do |format|
if @crossingcost.update(crossingcost_params)
format.html { redirect_to @crossingcost, notice: 'Crossingcost was successfully updated.' }
format.json { render :show, status: :ok, location: @crossingcost }
else
format.html { render :edit }
format.json { render json: @crossingcost.errors, status: :unprocessable_entity }
end
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_crossingcost
@crossingcost = Crossingcost.find(params[:id])
end
def set_ticket
@ticket = Ticket.find(params[:ticket_id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def crossingcost_params
params.require(:crossingcost).permit(:ticket_id, :usermetum_id, :amount,:firm_id)
end
def crossingcost_params_nested
params.require(:mynested_crossingcost).permit(:ticket_id, :usermetum_id, :amount,:firm_id)
end
所以首先,我建议您使用 Rails HTML Helpers 而不是将 ERB 包装到您的 HTML 标签中。看起来有点乱:
<%= link_to '#', class: 'editable bolbol editable-disabled', data: { pk: '1', type: 'text', url: crossingcost_path(crossingpost.id), title: 'Enter Amount' }, id: 'amount' do %>
<%= crossingcost.amount %>
<% end %>
而不是
<a href="#" class="editable bolbol editable-disabled" data-pk="1" id="amount" data-type="text" data-url="<%=crossingcost_path(crossingcost.id)%>" data-title="Enter Amount">
<%= crossingcost.amount %>
</a>
关于你的其他问题:
如果我理解正确的话,我认为解决这个问题的最好方法是直接允许参数而不是试图嵌套它们。
例如:
def crossingcost_params
params.permit(:name, :value, :pk, :id)
end
通过这种方式,您可以允许未嵌套的参数。
就像你的例子一样:
{
"name" => "amount",
"value" => "166",
"pk" => 1,
"id" => "1"
}
我认为在X-editable
中嵌套这个参数应该也是可以的。如果你想通过这种方式解决问题,请查看Docs。
希望对您有所帮助!
编码愉快:)