Rails - 使用 URL 参数创建关联对象

Rails - Creating Associated Object with URL params

我想从组织显示页面创建资产。我需要将组织 ID 传递给资产以进行创建。

# ../models/organisation.rb
has_many :assets

# ../models/asset.rb
belongs_to :organisation

我有一个创建资产的按钮,它在 URL 参数中传递 organisation.id。

# ../views/organisations/show.html.erb    
<%= link_to 'New Asset', new_asset_path(:organisation_id => @organisation.id) %>

我可以访问 ../views/assets/new 视图中的 organisation_id 值,但是,当我提交表单时,我收到 “Method not allowed” 错误。

# ../controllers/assets_controller.rb

def create
    @asset = Asset.new(params[:organisation_id])
    ...
end

问题 1:为什么会出现此错误:

Q2:还有其他方法可以将 organisation_id 传递到资产新页面吗? IE。不在 URL.

Q3:如果我只能通过URL传递ID,有没有办法阻止用户篡改? IE。将组织 ID 更改为其他内容并将资产保存到另一个组织。

问题 4:嵌套资源在这种情况下会有帮助吗?

Rails5.0.0.1,Ruby2.3.1

我认为你应该使用:

  def create
    @asset = Asset.new(organisation_id:params[:organisation_id])
  end

Q.1 - 错误是由于模型名称引起的 - "Assets"。这是 Rails.

中的保留字

可以通过将资产管道移动到另一个安装点来修复它。例如:

# config/initializers/assets.rb

Rails.application.config.assets.prefix = '/pipeline_assets'

如此处所述:

您需要告诉 Asset.new organisation_id 参数的用途,例如:

@asset = Asset.new(:organisation_id => params[:organisation_id])

否则你只是给它传递一个随机数,它会 "wtf is this?" :D

(好吧,从技术上讲,它正在寻找一个新方法的版本,该版本采用一个不是散列的参数......它找不到,然后告诉你该方法不存在...... .但相同的差异)。 ;)