Rails嵌套资源表单

时间:2013-12-19 04:24:26

标签: ruby-on-rails

我的项目的用户可以创建活动并评估其他人的活动。我在两个视图中使用_activity partial:一个用于列出用户自己的活动,另一个用于列出用户尚未评级的其他活动。在后一种情况下,我还包括一个表格来评估该活动。它应该使用当前用户的ID,活动的ID和他们的评级提交给评级模型。如何获取活动ID,因为它们不是@activity变量,只是一个@activities集合,它为每个成员呈现部分?我应该切换到每种方法吗?

到目前为止,这是我的代码:

表示用户自己的活动索引:

class ActivitiesController < ApplicationController

def index
    @user = current_user
    @activities = @user.activities.paginate(page: params[:page], :per_page => 10).order(created_at: :desc)
end

其他人的活动页面评分:

def not_rated
    @user = current_user
    @activities = Activity.not_rated(current_user).paginate(page: params[:page], :per_page => 10).order(created_at: :desc)
    @rating = Rating.new
end

调用partial(not_rated.html.erb)的两个视图中的第二个:

<div class="rate_activities">
        <h3> Rate Activities! (<%= @activities.count %>)</h3>
        <% if @activities.any? %>
            <%= render @activities %>
            <%= will_paginate @activities %>
            <% end %>
    </div>

_activity partial:

<ul class="activities" >
<li class="activity">
    <span class="content"><%= activity.content %></span>
    <span class="timestamp"><%= time_ago_in_words(activity.created_at) %> ago</span>
    <% unless activity.user_id == @user.id %>
        <%= form_for([@rating, activity]) :url => new_activity_rating_path do |f| %>
            <p><%= f.text_field :rating %></p>
            <%= f.submit "Submit my Activity", class: "mybutton" %>
        <% end %>
    <% end %>

</li>

谢谢!

2 个答案:

答案 0 :(得分:0)

您可以将其作为局部变量传递:

<%= render partial: 'activity', collection: @activities, locals: { activity: @activity } %>

答案 1 :(得分:0)

基于_activity partial中的代码,您已经可以访问activity变量,因此您的索引或not_rate操作中不需要实例var @activity。您的render @activities已经调用了_activity.html.erb部分内容,它会自动为同一部分提供本地变量activity

关于activity_id,您可以通过activity.id获取部分内容。类似的东西:

<%= f.hidden_field :id, value: activity.id %>

确保使用strong_parameters或protected_attributes进行白名单:id。