Rails 4 - 如何在另一个模型的视图中显示一个模型的表单

时间:2016-02-18 14:51:00

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

我有一个应用程序,我有项目,每个项目都有照片。每张照片的状态都是我希望能够在项目的显示页面上更新,该页面列出了其中的所有照片。因此,每张照片都会在显示的状态列中显示我的不同状态。

我可以在单独的页面上更新状态,没问题,但我需要每张照片都要在项目显示页面上显示表单。

这是我的photos_controller.rb

class PhotosController < ApplicationController

    def create
        @project = Project.find(params[:project_id])
        @photo = @project.photos.create(photo_params)
        @photo.save
        redirect_to @photo.project
    end

    def edit
        @photo = Photo.find(params[:id])
        @status_array = [] 
        Status.all.each do |status| 
            @status_array << status.value 
        end 
    end

    def update
        @photo = Photo.find(params[:id])
        @photo.update_attributes(photo_params)
        redirect_to @photo.project
    end

    private

    def photo_params
        params.require(:photo).permit(:provider, :attachment, :image_id, :size, :data_url, :url, :project_id, :status)
    end
end

这是我的projects_controller.rb

class ProjectsController < ApplicationController
    before_action :authenticate_user!, only: [:show]

    def create 
        @project = Project.create(project_params)
        @project.creator = current_user.email
        @project.save

        redirect_to @project
    end

    def index
        @projects = Project.all
    end

    def show
        @project = Project.find(params[:id])
        @photos  = @project.photos
        # @photo = Photo.find(params[:id])
    end

    private

    def project_params
        params.require(:project).permit(:project_num, :assigned, :project_status, :creator, :photo_id)
    end
end

这是我的表单views/photos/_edit.html.erb

<%= simple_form_for @photo do |f| %>
    <div class="form-group">
        <%= f.input :status, collection: @status_array %>
    </div>
    <div class="form-group">
        <%= f.button :submit, "Submit", class: 'btn btn-success' %>
    </div>
<% end %>

他们在我的节目中views/projects/show.html.erb内渲染表单所有照片循环都是<%= render 'photos/edit' %>

               <% if @project.photos %>
                    <% @project.photos.each do |photo| %>
                        <tr>
                            <td><%= image_tag("#{photo.data_url}") %></td>
                            <td><%=  if photo.provider != "" then photo.provider.titleize else "Uncategorized" end %></td>
                            <td><%= photo.image_id %></td>
                            <td><%= photo.size %></td>
                            <td><a href="<%= photo.url %>">Link to image</a></td>
                            <td class="status-<%= photo.id %>">
                                <% if photo.status %>
                                    <%= photo.status %>
                                <% else %>
                                    Pending
                                <% end %>
                                <br>
                                <%= render 'photos/edit' %>
                            </td>
                        </tr>
                    <% end %>
                <% else %>
                    <p>Sorry, this project has no photos currently</p>
                <% end %>

了解我没有在项目控制器@photo操作中声明show。 (目前已被注释掉)。但是当我确实宣布它时,我没有参数,我只有project id上的参数,所以我找不到这样的照片并用表格正确更新。我在这里有点迷失。非常感谢任何想法。

1 个答案:

答案 0 :(得分:2)

你没有定义正确的@photo变量,一个好的做法是不在partials中使用实例变量,并且总是手动将变量传递给它,更改你的部分如下:

<%= simple_form_for photo do |f| %>
    <div class="form-group">
        <%= f.input :status, collection: @status_array %>
    </div>
    <div class="form-group">
        <%= f.button :submit, "Submit", class: 'btn btn-success' %>
    </div>
<% end %>

然后在调用部分时发送当前照片:

<% if @project.photos %>
                    <% @project.photos.each do |photo| %>
                        <tr>
                            <td><%= image_tag("#{photo.data_url}") %></td>
                            <td><%=  if photo.provider != "" then photo.provider.titleize else "Uncategorized" end %></td>
                            <td><%= photo.image_id %></td>
                            <td><%= photo.size %></td>
                            <td><a href="<%= photo.url %>">Link to image</a></td>
                            <td class="status-<%= photo.id %>">
                                <% if photo.status %>
                                    <%= photo.status %>
                                <% else %>
                                    Pending
                                <% end %>
                                <br>
                                <%= render 'photos/edit', photo: photo %>
                            </td>
                        </tr>
                    <% end %>
                <% else %>
                    <p>Sorry, this project has no photos currently</p>
                <% end %>

查看我们传递当前照片的render,这样您的更新将按预期工作。确保在渲染此部分的任何地方都这样做。