【问题标题】:How to pass image url values from option select to form action in ruby on rails如何从选项选择中传递图像 url 值以在 ruby​​ on rails 中形成操作
【发布时间】:2015-06-04 18:26:30
【问题描述】:

我想通过填充带有多个选项的“选择”字段的表单从 url 保存图像。提交表单后,所选图像应与 Paperclip gem 一起保存。

这里是 html 选择代码块:

<select id="story_medium" name="story[medium]">
    <option data-img-src="http://www.somedomain.com/image0.jpg" value="0">http://www.somedomain.com/image0.jpg</option>
    <option data-img-src="http://www.somedomain.com/image1.jpg" value="1">http://www.somedomain.com/image1.jpg</option>
    <option data-img-src="http://www.somedomain.com/image2.jpg" value="2">http://www.somedomain.com/image2.jpg</option>
</select>

问题是,当我像通常使用 Paperclip 一样设置表单输入时,在本例中为“:medium”,我收到一条错误消息,显示“ActiveRecord::AssociationTypeMismatch at /stories Medium 预期,得到字符串” .这似乎是因为我将选项值作为字符串而不是整数传递。

Parameters: { "story"=>
    {"url"=>"http://www.somedomain.com/image2.jpg", 
    "title"=>"Title of Image", 
    "medium"=>"2", 
    "commit"=>"Submit"}

如果我将“:medium”更改为“:medium_id”,表单保存不会出错,但是,只保存了键值,Paperclip 不会从指定的 url 保存图像。

如何在表单操作中传递图像 url 的值,以便使用 Paperclip 正确保存?

Rails 4.1.8, 回形针 4.2.1, 红宝石 2.1.5p273

【问题讨论】:

  • follow this wiki 你的模型中图像字段的名称是什么?
  • 如果我按照文档的建议附加文件,使用 form.file_field,它可以正常工作。当我尝试使用 select 选项向用户呈现选项时,而不是直接上传文件,它似乎没有提交正确的参数。
  • 告诉我该字段的名称..
  • 我假设在你的模型中,故事属于媒介?
  • 我有一个媒体模型,它有一个名为“图像”的附件。

标签: ruby-on-rails ruby ruby-on-rails-4 gem paperclip


【解决方案1】:

选择列表传递与所选选项对应的。因此,您首先需要将它们更改为:

<select id="story_medium" name="story[medium]">
    <option data-img-src="http://www.somedomain.com/image0.jpg" value="http://www.somedomain.com/image0.jpg">image0.jpg</option>
    //.. same for all.
</select>

现在在控制器内部。

class StoryController < ApplicationController
  # ... code
  before_action :set_current_story
  after_action :set_image, only: [ :update, :create ] 

  def create
    # ..
  end

  private

  def set_image
    @story.picture = open(story_create_params[:medium])
    @story.save!
  end

  def story_create_params
    params.require(:story).permit(:medium)
  end

  def set_current_story
    @story = Story.find params[:id]
  end
end

【讨论】:

  • 这看起来很有希望..但现在我看到与 self.picture = open(params[:story][:medium] 相关的 #
  • 等待...忘记将值更改为 url
  • @alphaleonis 立即查看!
  • @R_O_R 您将params 带入模型。它不会那样工作。那时它是self.picture = open(medium)
  • 如果我将值更改为 url,我会收到“Medium expected, got String”错误
【解决方案2】:

看起来你没有使用回形针。模型中有你的has_attached_file :url 吗?设置好该部分后,您可能需要一个 setter,这意味着

#setter
def url_path=(val)
 url = File.open(val)
end

#getter
def url_path
 self.url
end

然后你的表单看起来像

<select id="story_medium_url_path" name="story[medium][url_path]">
    <option data-img-src="http://www.somedomain.com/image0.jpg" value="http://www.somedomain.com/image0.jpg">image0.jpg</option>
    //.. same for all.
</select>

在您的控制器中,将:url_path列入白名单

【讨论】:

  • @alphaleonis 这就是我所说的。
  • 我想我已经正确设置了所有东西,但是我得到了“#
  • 成功!我能够使用您的建议进行这项工作,并进行一些修改。原来我不需要#getter 方法。我还在模型中添加了require "open-uri",并将setter方法更改为self.image = open(val)
  • 太棒了!我很高兴能为您指明正确的方向。当您想在表单中显示图像时,使用 getter 方法。 IE; f.url_path。仅当您想以 DRY 方式在表单中显示它时。如果您对此类操作感到满意,请投票或标记为正确。 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-08
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 2022-08-11
  • 2011-06-19
  • 1970-01-01
相关资源
最近更新 更多