【问题标题】:Rails 4 controller actions for fields_for nested resources用于 fields_for 嵌套资源的 Rails 4 控制器操作
【发布时间】:2014-01-10 23:20:19
【问题描述】:

我正在尝试了解 Rails 的 field_for,特别是对于嵌套资源应该进入控制器的内容。我的问题是,当我通过漫画表单创建带有漫画页面的漫画时,页面的图像没有保存。

我有用户、漫画和漫画页面。以下是模型:

class User < ActiveRecord::Base
  has_many :comics
  has_many :comic_pages, through: :comics
end

class Comic < ActiveRecord::Base
    belongs_to :user
    has_many :comic_pages, :dependent => :destroy
    accepts_nested_attributes_for :comic_pages
end

class ComicPage < ActiveRecord::Base
    belongs_to :comic
end

这是 Comic 的表单,我还想在其中添加 Comic_pages:

 <%= form_for ([@user, @comic]) do |f| %>
    <%= f.text_field :title %>
    <%= f.fields_for :comic_pages do |comic_page| %>
        <%= comic_page.file_field :comic_page_image %>
    <% end %>
    <div class="actions">
      <%= f.submit %>
    </div>
  <% end %>

我对comics_controller(新建和创建操作)感到困惑。如何将comic_page 参数传递给这个控制器???

  def new
    @user = current_user
    @comic = @user.comics.new
    @comic.comic_pages.build
  end

  def create
    @user = current_user
    @comic = @user.comics.new(comic_params)
    @comic.comic_pages.build

    respond_to do |format|
      if @comic.save
        format.html { redirect_to @user, notice: 'Comic was successfully created.' }
        format.json { render action: 'show', status: :created, location: @user }
      else
        format.html { render action: 'new' }
        format.json { render json: @comic.errors, status: :unprocessable_entity }
      end
    end
  end

private
# Use callbacks to share common setup or constraints between actions.
def set_comic
  @comic = Comic.find(params[:id])
end

# Never trust parameters from the scary internet, only allow the white list through.
def comic_params
  params.require(:comic).permit(:title, :synopsis)
end

def comic_page_params
  params.require(:comic_page).permit(:comic_page_image, :comic_image_file_name)
end

非常感谢!

--- 编辑 ---

在参数的答案之后,我用它来创建以下创建操作:

def create
    @user = current_user
    @comic = @user.comics.new(comic_params)

    i = 0
    until i = 1
      @comic_page = @comic.comic_pages.new(comic_params[:comic_pages_attributes]["#{i}"])
      @comic_page.save
      i += 1
    end

    respond_to do |format|
      if @comic.save
        ...
      end
    end
  end

【问题讨论】:

  • 嘿,这里有一个网络用户。需要一些帮助。您的案例使用了一对多的方法,并且您确实使它起作用了。是否可以通过一对多的简单方法使用嵌套表单? (简单,意思是没有:through 表)

标签: ruby-on-rails ruby-on-rails-4 nested-forms nested-attributes fields-for


【解决方案1】:

您需要在控制器的 comic_params 部分中允许您想要保存的来自 comic_pages 的字段

params.require(:comic).permit(:title, :synopsis, comic_pages_attributes: [:comic_page_image])

【讨论】:

  • 感谢您的回答!我稍作修改,将发布我的控制器的外观。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-20
  • 1970-01-01
相关资源
最近更新 更多