ruby-on-rails – Rails参数不会传递给’params’变量

ruby-on-rails – Rails参数不会传递给’params’变量,第1张

概述我正在使用Rails 4进行应用程序. 基本上,我有两个型号,Card和CardCollection. CardCollections has_many卡. 我用嵌套属性实现了这种关系. class Card < ActiveRecord::Base belongs_to :card_collectionendclass CardCollection < ActiveRecord::Ba 我正在使用Rails 4进行应用程序.

基本上,我有两个型号,Card和CardCollection.
CardCollections has_many卡.
我用嵌套属性实现了这种关系.

class Card < ActiveRecord::Base  belongs_to :card_collectionendclass CardCollection < ActiveRecord::Base  has_many :uploaded_cards,class_name: 'Card',dependent: :destroy  accepts_nested_attributes_for :uploaded_cards,allow_destroy: trueend

形式如下.

<%= form_for @card_collection,options do |f| %>  <%= f.fIElds_for :uploaded_cards do |ff| %>    <%= render 'cards/card_form',f: ff %>  <% end %><% end %>

当我在表单中放入一些数据并按下提交按钮时,我可以看到参数正确传递给服务器. (根据服务器日志)

Parameters: {"utf8"=>"✓","authenticity_token"=>"YFn7RsQzR4Sq1bjR+mOhCASWmeqAxw9B30oAHCL9qzk=","card_collection"=>{"collectible_ID"=>"16","collectible_type"=>"Scrapbook","uploaded_cards_attributes"=>{"0"=>{"_destroy"=>"false","image_url"=>"https://s3-ap-northeast-1.amazonaws.com/bucketplace/uploads/image_content/src/2833/2b67142422.jpg","place"=>"1","style"=>"0","description"=>"생각을 짓다......","ID"=>"97"},"1"=>{"image_url"=>"http://hodoli.s3.amazonaws.com/uploads%2F14_06_02_17_17_56_62276930_468703135.jpg","place"=>"7","style"=>"1","description"=>"123"}}},"project_cover_image_url"=>"","commit"=>"확인","ID"=>"16"}

但是当我在程序代码中真正打印’params’变量时,params [:card_collection] [:uploaded_cards_attributes] hash(嵌套属性部分)突然丢失.所以打印的params值如下所示.

"params=  {\"utf8\"=>\"✓\",\"_method\"=>\"patch\",\"authenticity_token\"=>\"YFn7RsQzR4Sq1bjR+mOhCASWmeqAxw9B30oAHCL9qzk=\",\"card_collection\"=>{\"collectible_ID\"=>16,\"collectible_type\"=>\"Scrapbook\"},\"project_cover_image_url\"=>\"\",\"commit\"=>\"확인\",\"action\"=>\"update\",\"controller\"=>\"card_collections\",\"ID\"=>\"16\"}"Unpermitted parameters: collectible_ID,collectible_type

我不知道为什么会这样.我认为它与’强参数’没有关系,因为问题出在Rails端参数解析部分. (我认为)
请帮我找到确切的问题和解决方案.

编辑

这是我的控制器代码

class CardCollectionsController < ApplicationControllerbefore_action :set_card_collection,only: [:do_upload,:edit,:update]before_action :authenticate_user!,only: [:upload,:do_upload,:update]before_action :authenticate_card_collection_owner!,:update]# GET /card_collections/upload_selectdef upload_selectend# GET /card_collections/uploaddef upload    @card_collection = CardCollection.newenddef do_upload    respond_to do |format|        p card_collection_params        if @card_collection.update(card_collection_params)            format.HTML do                @card_collection.collectible.update(cover_image_url: params[:project_cover_image_url]) unless params[:project_cover_image_url].blank?                redirect_to @card_collection.collectible,notice: 'CardCollection was successfully updated.'            end            format.Json { head :no_content }        else            @card_collection = CardCollection.new(card_collection_params)            format.HTML { render 'upload',alert: '에러' }            format.Json { render Json: @card_collection.errors,status: :unprocessable_entity }        end    endend# GET /card_collections/1/editdef editend# PATCH/PUT /card_collections/1# PATCH/PUT /card_collections/1.Jsondef update    respond_to do |format|        if @card_collection.update!(card_collection_params)            format.HTML do                @card_collection.collectible.update(cover_image_url: params[:project_cover_image_url]) unless params[:project_cover_image_url].blank?                redirect_to @card_collection.collectible,notice: 'CardCollection was successfully updated.'            end            format.Json { head :no_content }        else            format.HTML { render 'edit',status: :unprocessable_entity }        end    endendprivate# Use callbacks to share common setup or constraints between actions.def set_card_collection    if params[:ID]        @card_collection = CardCollection.find(params[:ID])        params[:card_collection] = {collectible_ID: @card_collection.collectible_ID,collectible_type: @card_collection.collectible_type}    elsif params[:card_collection][:collectible_ID].blank?        @card_collection = CardCollection.new(card_collection_params)        flash.Now[:alert] = '스크랩북을 선택해 주세요'        render 'upload'    else        @card_collection = CardCollection.find_by_collectible_ID_and_collectible_type(params[:card_collection][:collectible_ID],params[:card_collection][:collectible_type])    endend# Never trust parameters from the scary internet,only allow the white List through.def card_collection_params    params.require(:card_collection).permit(CardCollection.param_names + [uploaded_cards_attributes: Card.param_names])enddef authenticate_card_collection_owner!    redirect_to prevIoUs_url if current_user != @card_collection.userendendclass CardCollection < ActiveRecord::Basedef self.param_names    [:ID,:name,:description]endendclass Card < ActiveRecord::Base    def self.param_names    [:ID,:image_url,:description,:place,:style,:source,:wIDth,:height]endend

解决了
最后,由于@Rich Peck,我解决了这个问题.
真正的问题是关于Rails的路由部分.
我在一个控制器中通过两种方式识别特定记录,如’set_card_collection’方法中所示.

resources :card_collection,only: [:edit,:update] do  get :upload,on: :collection  patch :do_upload,on: :collection end

原始route.rb文件看起来像上面.
我构建了我的路由文件(当用户连接上传页面时不指定CardCollection ID),以便用户灵活地在上传页面中选择CardCollection.
但是要连接编辑页面,用户必须指定记录ID,例如/ card_collection / 1 / edit,因为它是Rails的默认行为.

然后我在控制器中定制了’set_card_collection’方法.

if params[:ID]        @card_collection = CardCollection.find(params[:ID])        params[:card_collection] = {collectible_ID: @card_collection.collectible_ID,params[:card_collection][:collectible_type])

尽管如此,我不知道确切原因,但使用默认值:编辑和:更新路由设置导致嵌套参数无法正确传递的问题.所以在我改变了我的route.rb文件之后,统一识别记录的方式,问题就解决了.

resources :card_collections,only: [] do    get :upload_select,on: :collection    get :upload,on: :collection    post :upload,on: :collection,to: :do_upload    get :edit,on: :collection    patch :update,on: :collection    put :update,on: :collectionend
解决方法 有许多问题可能导致这种情况

错误

我看到你的系统正在生成uploaded_cards_attributes,这是跨越的最大障碍

这意味着问题要么是你的强大的params(我怀疑因为params哈希在你的控制器中完全可用(它是你想要限制访问的模型);或者你如何管理里面的params控制器

我不知道如何解决你的问题,但它可能不会成为Rails问题

补救

我最初会看看你是如何通过参数的

看起来你正在使用编辑/更新方法(通过使用PATCH动词).这可能是一个问题,因为Rails可能无法传递已创建对象的数据.

我最初将使用新表单进行测试 – 以查看是否可以使用嵌套属性创建新对象.如果你能做到这一点,我会在你的路线中使用nested resources进行测试.直接编辑CardCollection对象:

#config/routes.rbresources :card_collections do   resources :card_uploadsend

这将允许您执行以下 *** 作:

#app/controllers/card_collections_controller.rbclass CardCollectionsController < AppicationController   def edit       @card_collection = CardCollection.find params[:card_collection_ID]       @card_upload = @card_collectiom.new #-> might need to change   endend#app/vIEws/card_collections/edit.HTML.erb<%= form_for @card_upload do |f| %>    <%=  f.file_fIEld :image %>    <%=  f.submit %><% end %>

请记住,这是一个测试 – 所以我不会在生产中使用它;我只是想知道为什么你没有收到参数.

属性

顺便说一句,我们使用attribute_names方法使我们的强参数干燥:

def your_params    parameters = Model.attribute_names - %w(ID created_at updated_at)    params.require(:parent).permit(parameters)end
总结

以上是内存溢出为你收集整理的ruby-on-rails – Rails参数不会传递给’params’变量全部内容,希望文章能够帮你解决ruby-on-rails – Rails参数不会传递给’params’变量所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1269854.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存