【问题标题】:can't show an Image in my _form view in a nested model edit page无法在嵌套模型编辑页面的 _form 视图中显示图像
【发布时间】:2012-06-16 18:43:24
【问题描述】:

我正在使用 Carrierwave 将图像字段添加到基于 Ryan Bates 修订的 #196 截屏视频的 Rails 嵌套模型中。 Carrierwave 位基于他的截屏视频 #253

问答模型嵌套在类别模型中。

我可以让图像上传并显示在“显示”页面上。但是当我返回编辑视图时,没有图像,我仍然看到选择文件按钮旁边的“未选择文件”文本。我可以来回切换到 Show 页面,它仍然出现在 Show 中,但永远不会出现在 Edit 中。我的用户会认为他们每次都必须上传新图片!

我的显示视图中有这行代码:

<%= image_tag question.image_url(:thumb).to_s if question.image? %>

但如果我尝试将其放入 _form 视图中,则会出现未知的局部变量或方法错误。

我尝试了几个 if 语句,但都没有成功。我试图将其全部放在编辑视图中,但无济于事。

我的 _form 视图:

<%= form_for @category, :html => {:multipart => true} do |f| %>
  <% if @category.errors.any? %>
    <div class="error_messages">
      <h2><%= pluralize(@category.errors.count, "error") %> prohibited this category from being saved:</h2>
      <ul>
      <% @category.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div id="categorytitle" class="field">
    <%= f.label :name, "Category Name" %><br />
    <%= f.text_field :name %>
  </div>

  <%= f.fields_for :questions do |builder| %>
    <%= render 'question_fields', f: builder %>
  <% end %>
  <%= link_to_add_fields "Add Question", f, :questions %>

  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

我的 _questions 部分

<fieldset id="questionarea">
  <%= f.label :content, "Question" %>
  <%= f.text_field :content%>
  <hr>
  <div class="field">
    <p>
      <%= f.check_box :active, class: "pull-left" %>
      <%= f.label :active %>
      <span class="help-block">Turning questions on and off helps you customize the category.</span>
    </p>
  </div>
  <hr>

  <div class="field clearthat">
    <%= f.label :image, "Add an Image"%>
    <span class="help-block">Images will help non-readers understand the question.</span>
    <%= f.file_field :image %>
    <%= f.hidden_field :image_cache %>
  </div>
  <hr>
  <!-- <%= link_to "remove", '#', class: "remove_fields" %> -->
  <p class="clearthat">&nbsp;</p>
  <%= f.fields_for :answers do |builder| %>
    <%= render 'answer_fields', f: builder %>
  <% end %>
  <%= link_to_add_fields "Add Answer", f, :answers %>
</fieldset>

有一个 _answer 部分,但似乎没有考虑在内。

这是我尝试将图像直接放入我的 _question 部分时收到的错误消息(从上面 _question 代码的中心截取):

<div class="field clearthat">
  <%= f.label :image, "Add an Image"%>
  <span class="help-block">Images will help non-readers understand the question.</span>
  <%= image_tag question.image_url(:thumb).to_s  if question.image?  %>
  <%= f.file_field :image %>
  <%= f.hidden_field :image_cache %>
</div>

这是我得到的错误:

NameError in Categories#edit
undefined local variable or method `question'

我的类别模型:

class Category < ActiveRecord::Base
  attr_accessible :name, :questions_attributes
  has_many :questions
  accepts_nested_attributes_for :questions, allow_destroy: true
end

我的问题模型:

class Question < ActiveRecord::Base
  attr_accessible :content, :category_id, :answers_attributes, :active, :image, :image_cache
  belongs_to :category
  has_many :answers
  accepts_nested_attributes_for :answers, allow_destroy: true
  mount_uploader :image, ImageUploader
end

我的类别控制器:

class CategoriesController < ApplicationController
  before_filter :signed_in_user, only: [:index, :edit, :update, :destroy]
  before_filter :correct_user,   only: [:edit, :update]
  before_filter :admin_user,     only: :destroy


def index
  @categories = Category.all
end

def show
  @category = Category.find(params[:id])
end

def new
  @category = Category.new
end

def create
  @category = Category.new(params[:category])
  if @category.save
    redirect_to @category, :notice => "Successfully created category."
  else
    render :action => 'new'
  end
end

def edit
  @category = Category.find(params[:id])
end

def update
  @category = Category.find(params[:id])
  if @category.update_attributes(params[:category])
    redirect_to @category, :notice  => "Successfully updated category."
  else
    render :action => 'edit'
  end
end

def destroy
  @category = Category.find(params[:id])
  @category.destroy
  redirect_to categories_url, :notice => "Successfully destroyed category."
end

private

  def signed_in_user
    unless signed_in?
      store_location
      redirect_to signin_path, notice: "Please sign in."
    end
  end

  def correct_user
    @user = User.find(params[:id])
    redirect_to(root_path) unless current_user?(@user)
  end

  def admin_user
    redirect_to(root_path) unless current_user.admin?
  end

结束

感谢任何可以提供帮助的人。

【问题讨论】:

    标签: ruby-on-rails nested-forms carrierwave railscasts


    【解决方案1】:

    也许我的问题没有得到很好的回答,因为我没有得到任何帮助。但我终于想通了!

    这是导致问题的代码行:

    <%= image_tag question.image_url(:thumb).to_s if question.image? %>
    

    这是有效的代码行:

    <%= image_tag f.object.image_url(:thumb) %>
    

    我不是很清楚,但似乎我的问题是片面的,并且调用了一个名为 question 和 rails 的方法不知道我的意思。

    我在这个 stackoverflow QA 中找到了答案:Rails Nested Forms With Images

    现在我有了一个有效的 if 语句,以便我的用户可以更改图像:

    <% if f.object.image? %>
      <%= image_tag f.object.image_url(:thumb) %>
      <%= f.file_field :image %>
    <% else %>
      <%= f.file_field :image %>
      <%= f.hidden_field :image_cache %>
    <% end %>
    

    接下来我要弄清楚如何更改 file_field 按钮上的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-09
      • 2011-04-12
      • 2017-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多