【问题标题】:rails 4 with link_to and method post with strong parameters带有 link_to 的 rails 4 和带有强参数的方法 post
【发布时间】:2013-08-15 07:44:24
【问题描述】:

我遇到了一个不可能那么复杂的问题,但我只是没有把事情做好。

假设我有两个模型:

class Notification < ActiveRecord::Base
  belongs_to :device

  validates :number, presence: true
end

class Device < ActiveRecord::Base
  belongs_to :user
  has_many :notifications, :dependent => :destroy

  //rest omitted for brevity
end

嵌套路由如下:

 resources :devices do
   resources :notifications
 end

还有一个像这样的通知控制器:

class NotificationsController < ApplicationController
  before_filter :authenticate_user!
  before_action :set_device, :only => [:index, :new, :create]
  before_filter :load_notification, only: :create

  load_and_authorize_resource :device
  load_and_authorize_resource :notification, :through => :device


  def index
  end

  def new
    @notification = @device.notifications.build
  end

  def create
    params.each do |param|
      logger.debug param
    end
    @notification = @device.notifications.build(notification_params)
    if @notification.save
      redirect_to [@notification.device, @notifications], notice: 'Notification was successfully created.'
    else
      render action: 'new'
    end
  end

  private

  def load_notification
    @notification = Notification.new(notification_params)
  end

  def set_device
    @device = Device.find(params[:device_id])
  end

  def notification_params
    params.fetch(:notification, {}).permit(:number, :device_id, :message)
  end
end

现在说到创建通知: 表单按方面工作。但是:我想实现第二个目标。 通知应该是可重新发送的,所以我在通知索引视图中有这个:

<%= link_to 'Resend', device_notifications_path(number: notification.number, message: notification.message), :method => :post %>

但验证失败,我重定向到新页面,没有任何预填充字段告诉我该数字是必需的,所以肯定遗漏了一些我没有得到的明显内容。

请求中的参数:

[["user_id", xyz]]
["_method", "post"]
["authenticity_token", "myauthenticitytokenstring"]
["number", "+1555123456789"]
["action", "create"]
["controller", "notifications"]
["device_id", "9"]
["notification", {}]

(不需要留言)

我认为错误在于控制器中的 notification_params 方法。

有人可以帮帮我吗?

【问题讨论】:

    标签: http-post ruby-on-rails-4 link-to strong-parameters


    【解决方案1】:

    我刚才遇到了类似的问题,这对我有用:

    <%= link_to 'Resend', device_notifications_path(@notification.device_id, notification: { number: notification.number, message: notification.message }), :method => :post %>
    

    基本上,您需要将控制器/模型数据包装到控制器参数的散列中。这就是控制器本身读取它的方式。另外,你是不是错过了device_notifications_path 中的device_id

    [["user_id", xyz]]
    ["_method", "post"]
    ["authenticity_token", "myauthenticitytokenstring"]    
    ["action", "create"]
    ["controller", "notifications"]
    ["device_id", "9"]
    ["notification", {["number", "+1555123456789"]}]
    

    现在,我只是假设device_id 位于您的 URL 路由中: http:\\localhost:3000\notifications\9

    这就是为什么device_id 不必在散列本身中的原因。这只是基于我在这里的假设,没有更多的viewroutes 继续。总而言之,它确实与哈希有关。玩一下,然后使用p 打印出你的 development.log 中的数据进行测试:

    def create
      p params
      p notification_params
    
      ...
    end
    

    此外,可选但不是必需的,您可以使用 .require 而不是 .fetch 来干掉控制器的参数 def,如下所示:

    private
    
    def notification_params
      params.require(:notification).permit(:number, :device_id, :message)
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-14
      • 2011-02-12
      • 1970-01-01
      • 1970-01-01
      • 2011-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多