基本上,我有两个型号,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’变量所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)