【问题标题】:changing a passed param from更改传递的参数
【发布时间】:2015-12-05 19:36:35
【问题描述】:

我需要将参数传递给辅助方法,但它没有显示为整数。为什么我的param[:trait] 显示为{:value=>"1"} 而不是1?我试图将它传递给一个名为create_personality(trait) 的助手,它不会接受create_personality(params[:trait])...但它可以与create_personality(1) 一起正常工作...如果我只是将预期值放在括号中。

cats_helper.rb

module CatsHelper
  def personalities(trait)
    if trait == 1
     'Happy Cat'
    elsif trait == 2
      'Sad Cat'
    else
    end
  end

end

pet.rb

class Pet < ActiveRecord::Base
  include CatsHelper

  def create_personality(trait)
    personality_kind = personalities(trait)
    PetTrait.create!(personality: personality_kind, pet_id: self.id )
  end

end

pets_controller.rb

class PetsController < DashboardController

  def create
    @new_pet = Pet.new(pet_params)
    trait =  params[:trait]
    puts "#{trait}" *1000 #This is how I know that {:value=>"1"} is being passed
    respond_to do |format|
      if @new_pet.save
        @new_pet.create_personality(trait)# <---- here is the call to the method
        format.html { redirect_to pet_path(@new_pet)}
        format.json {  render   }
      else
       # etc....
      end
    end
  end
end

_form.html.slim

      = simple_form_for [@new_pet], multipart: true do |f|
       = f.hidden_field :trait, value: 1

【问题讨论】:

  • 由于您使用form,因此该值应包装到pet 资源中。如果你打电话给params[:pet][:trait],你会得到什么价值?
  • 0 ...特征不是宠物的列
  • 你检查过 HTML 吗?我认为这是客户端的问题。如果这个网站是在线的或开源的,你可以给我一个链接,我会检查它。
  • 两者都不是,不过谢谢
  • 我已经快速复制了您的场景并且效果很好。只需查看Repo 并告诉我是否有不同之处。我只是使用了一个快速脚手架并安装了simple_form

标签: ruby-on-rails forms ruby-on-rails-4 parameter-passing


【解决方案1】:

或者如果您只需要整数值,则使用trait = params[:trait][:value].to_i

【讨论】:

  • 这给出了错误:“nil:NilClass 的未定义方法 `[]'”
  • to_i 需要在方法调用中...而不是在参数之后
【解决方案2】:

我不相信 f.hidden_fieldsimple_form 语法。这是标准导轨。

试试这个:

f.input :trait, :as => :hidden, :input_html => { :value => 1 }

【讨论】:

  • 这并不能修复错误,但感谢您提供正确的语法
【解决方案3】:

如果trait不是宠物栏,你应该尝试使用

= hidden_field_tag :trait, 1 

【讨论】:

  • 为 params[:trait] 给出 {:value=>1} 并且如果它的' params[:pet][:trait] 则不通过
  • 是的,您应该使用trait = params[:trait][:value] 来获取控制器中的参数
  • 这不是form helpers 的默认行为,所以你不应该只使用params[:trait][:value]
  • @yang 没有让我将 Symbol 隐式转换为 Integer
【解决方案4】:

最终起作用的是两个答案的混合。这是有效的控制器方法...注意“to_i”需要在方法调用中才能工作...并且它应该是 params[:pet][:trait]。

 def create
    @new_pet = Pet.new(pet_params)
    trait =  params[:pet][:trait]
    respond_to do |format|
      if @new_pet.save
        @new_pet.create_personality(trait.to_i)# <---- here is the call to the method
        format.html { redirect_to pet_path(@new_pet)}
        format.json {  render   }
      else
       # etc....
      end
    end
  end

【讨论】:

    猜你喜欢
    • 2012-03-13
    • 1970-01-01
    • 2019-10-08
    • 1970-01-01
    • 2015-12-04
    • 2014-09-14
    • 2021-10-25
    • 2011-03-07
    • 1970-01-01
    相关资源
    最近更新 更多