ruby-on-rails – Rails参数不会传递给’params’变量
我正在使用Rails 4进行应用程序.
基本上,我有两个型号,Card和CardCollection. class Card < ActiveRecord::Base belongs_to :card_collection end class CardCollection < ActiveRecord::Base has_many :uploaded_cards,class_name: 'Card',dependent: :destroy accepts_nested_attributes_for :uploaded_cards,allow_destroy: true end 形式如下. <%= 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+mOhCASWmeqAxw9B30oAHCL 9qzk=","card_collection"=>{"collectible_id"=>"16","collectible_type"=>"Scrapbook","uplo aded_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"=>"YFn7RsQzR4Sq 1bjR+mOhCASWmeqAxw9B30oAHCL9qzk=","card_collection"=>{"collectible_id"=>16,"collec tible_type"=>"Scrapbook"},"project_cover_image_url"=>"","commit"=>"??","a ction"=>"update","controller"=>"card_collections","id"=>"16"}" Unpermitted parameters: collectible_id,collectible_type 我不知道为什么会这样.我认为它与’强参数’没有关系,因为问题出在Rails端参数解析部分. (我认为) 编辑 这是我的控制器代码 class CardCollectionsController < ApplicationController before_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_select def upload_select end # GET /card_collections/upload def upload @card_collection = CardCollection.new end def 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 end end # GET /card_collections/1/edit def edit end # PATCH/PUT /card_collections/1 # PATCH/PUT /card_collections/1.json def 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 end end private # 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]) end end # 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]) end def authenticate_card_collection_owner! redirect_to previous_url if current_user != @card_collection.user end end class CardCollection < ActiveRecord::Base def self.param_names [:id,:name,:description] end end class Card < ActiveRecord::Base def self.param_names [:id,:image_url,:description,:place,:style,:source,:width,:height] end end 解决了 resources :card_collection,only: [:edit,:update] do get :upload,on: :collection patch :do_upload,on: :collection end 原始route.rb文件看起来像上面. 然后我在控制器中定制了’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: :collection end 解决方法
有许多问题可能导致这种情况
– 错误 我看到你的系统正在生成uploaded_cards_attributes,这是跨越的最大障碍 这意味着问题要么是你的强大的params(我怀疑因为params哈希在你的控制器中完全可用(它是你想要限制访问的模型);或者你如何管理里面的params控制器 我不知道如何解决你的问题,但它可能不会成为Rails问题 – 补救 我最初会看看你是如何通过参数的 看起来你正在使用编辑/更新方法(通过使用PATCH动词).这可能是一个问题,因为Rails可能无法传递已创建对象的数据. 我最初将使用新表单进行测试 – 以查看是否可以使用嵌套属性创建新对象.如果你能做到这一点,我会在你的路线中使用 #config/routes.rb resources :card_collections do resources :card_uploads end 这将允许您执行以下操作: #app/controllers/card_collections_controller.rb class CardCollectionsController < AppicationController def edit @card_collection = CardCollection.find params[:card_collection_id] @card_upload = @card_collectiom.new #-> might need to change end end #app/views/card_collections/edit.html.erb <%= form_for @card_upload do |f| %> <%= f.file_field :image %> <%= f.submit %> <% end %> 请记住,这是一个测试 – 所以我不会在生产中使用它;我只是想知道为什么你没有收到参数. – 属性 顺便说一句,我们使用 def your_params parameters = Model.attribute_names - %w(id created_at updated_at) params.require(:parent).permit(parameters) end (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |