加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 02:06:44 所属栏目:百科 来源:网络整理
导读:我正在使用Rails 4进行应用程序. 基本上,我有两个型号,Card和CardCollection. CardCollections has_many卡. 我用嵌套属性实现了这种关系. class Card ActiveRecord::Base belongs_to :card_collectionendclass CardCollection ActiveRecord::Base has_many :
我正在使用Rails 4进行应用程序.

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

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

解决了
最后,由于@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: :collection
end

解决方法

有许多问题可能导致这种情况

错误

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

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

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

补救

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

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

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

#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 %>

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

属性

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读