0

У меня есть приложение для рельсов. Я показываю больше частичных (пользователь, задача, беседа, сообщение) из разных классов на странице users /: id/show. Я установил все переменные экземпляра (для других классов) в упражнении def shows.controller.больше рельсов части на той же странице

Кажется, что это немного тяжело, так лучше ли это? (Я использую @task и @message для AJAX-вызовов.)

def show 
    @user = User.find(params[:id]) 
    if Task.between(current_user.id, @user.id).present? 
     @tasks = Task.uncompleted.between(current_user.id, @user.id).order("created_at DESC").includes(:assigner).paginate(page: params[:page], per_page: 12) 
     @task = Task.new 
     if Conversation.between(current_user.id, @user.id).present? 
     @conversation = Conversation.between(current_user.id, @user.id).first 
     @messages = @conversation.messages.includes(:user) 
     @message = Message.new 
     respond_to do |format| 
      format.html 
      format.js { render :template => "tasks/update.js.erb", :template => "tasks/destroy.js.erb", layout: false } 
     end 
     end 
    else 
     redirect_to user_profile_path(@user) 
    end 
    end 

ОБНОВЛЕНО:

пользователей/шоу:

<%if @conversation%> 
    <%= render 'conversations/show' %> 
<% end %> 

<tbody class="newtaskinsert2"> 
    <%= render partial: "tasks/task_between", collection: @tasks, as: :task %> 
</tbody> 

беседы/_show:

<div class="chatboxcontent"> 
    <% if @messages.any? %> 
     <%= render @messages %> 
    <% end %> 
</div> 
<div class="chatboxinput"> 
    <%= form_for([@conversation, @message], :remote => true, :html => {id: "conversation_form_#{@conversation.id}"}) do |f| %> 
     <%= f.text_area :body, class: "chatboxtextarea", "data-cid" => @conversation.id %> 
    <% end %> 
    <%= form_for([@conversation, @message], html: {class: "refile_form"}, remote: true) do |form| %> 
     <span class="btn btn-success btn-sm btn-file">Choose file 
     <%= form.attachment_field :message_attachment, direct: true, presigned: true, class: "choosefile" %></span> 
     <%= form.submit "Send File", class: "btn btn-primary btn-sm btn-submit-refile", style:"display:none"%> 
    <% end %> 
    <span id="progresspercent"></span> 
</div> 

ответ

1

Вы можете сохранить только переменную экземпляра @user в контроллере, а в частичном использовании: @ user.tasks вместо @tasks, @ user.tasks.new вместо @task и т.д. Следует также отметить, что вы можете передать параметры частичных (3.4.4 Passing Local Variables)

Для образца:

<%= render partial: "your_partial", locals: {tasks: @user.tasks} %> 

Update:

С путем (методами вызова из класса, а не объекты), вы можете сделать что-то вроде этого:

def show 
    @user = User.find(params[:id]) 
    if Task.between(current_user.id, @user.id).present? 
    # @user.tasks.where(another_user_field_name: current_user).present? - looks more like Rails way 
     @tasks = Task.uncompleted.between(current_user.id, @user.id).order("created_at DESC").includes(:assigner).paginate(page: params[:page], per_page: 12) 
     @conversation = Conversation.between(current_user.id, @user.id).first  
     if @conversation 
     respond_to do |format| 
      format.html 
      format.js { render :template => "tasks/update.js.erb", :template => "tasks/destroy.js.erb", layout: false } 
     end 
     end 
     # Do not forget that if @conversation is not exists this code render views by default way 
    else 
     redirect_to user_profile_path(@user) 
    end 
    end 


<%= render 'conversations/show' %> 
<tbody class="newtaskinsert2"> 
    <%= render partial: "tasks/task_between"%> 
</tbody> 


<%if @conversation%> 
    <div class="chatboxcontent"> 
    <%= render '_your_messages_partial', locals: {messages: @conversation.messages.includes(:user)}%> 
    </div> 
    <div class="chatboxinput"> 
    <%= form_for([@conversation, @conversation.messages.new], :remote => true, :html => {id: "conversation_form_#{@conversation.id}"}) do |f| %> 
     <%= f.text_area :body, class: "chatboxtextarea", "data-cid" => @conversation.id %> 
    <% end %> 
    <%= form_for([@conversation, @conversation.messages.new], html: {class: "refile_form"}, remote: true) do |form| %> 
     <span class="btn btn-success btn-sm btn-file">Choose file 
     <%= form.attachment_field :message_attachment, direct: true, presigned: true, class: "choosefile" %></span> 
     <%= form.submit "Send File", class: "btn btn-primary btn-sm btn-submit-refile", style:"display:none"%> 
    <% end %> 
    <span id="progresspercent"></span> 
    </div> 
<% end %> 

Вы можете сделать код более короче в случае использования соотношений (@ user.conversations вместо Conversation.between ... и т.д.)

+0

Сергей, прошу прощения за длительный ответ. Не могли бы вы показать мне через образец кода, как бы вы реорганизовали мои пользователи/шоу и контроллер? Я обновил свой вопрос. Как вы видите на странице users/show, я визуализую задачи и беседу, а в частилизованном разворачивании я показываю формы сообщений/сообщений. –

+0

Я обновил свой ответ –

0

Я хотел бы предложить использовать методы кэширования для просмотров:

http://edgeguides.rubyonrails.org/caching_with_rails.html#fragment-caching http://edgeguides.rubyonrails.org/caching_with_rails.html#russian-doll-caching

В крайнем случае, когда производительность по-прежнему является проблемой для вас, я бы рекомендовал начать denormalising парциальные до тех пор, пока вновь доволен выступлением.

Смежные вопросы