【问题标题】:How to use "link_to" instead of "checkbox" for POST?如何在 POST 中使用“link_to”而不是“checkbox”?
【发布时间】:2015-10-18 08:18:41
【问题描述】:

这个想法是当用户有missed_day(又名罢工)时,他会点击这个按钮。他目前可以单击复选框来标记missed_day

习惯/表演

<div class="strikes">
  <% if @habit.current_level_strike %> 
    <div class="btn" id="red"> <label id="<%= @habit.id %>" class="habit-id">Strikes:</label>
  <% else %> 
    <div class="btn" id="gold"> <label id="<%= @habit.id %>" class="habit-id-two">Strikes:</label>
  <% end %>
    <% @habit.levels.each_with_index do |level, index| %>
      <% if @habit.current_level >= (index + 1) %>
        <p data-submit-url="<%= habit_level_days_missed_index_path({ habit_id: @habit.id, level_id: level.id }) %>"
           data-delete-url="<%= habit_level_days_missed_path({ habit_id: @habit.id, level_id: level.id, id: 1 }) %>">
          <% if @habit.current_level_strike %> 
            <label id="<%= level.id %>" class="level-id">Level <%= index + 1 %>:</label> 
          <% else %> 
            <label id="<%= level.id %>" class="level-id-two">Level <%= index + 1 %>:</label> 
          <% end %>
          <%= check_box_tag nil, true, level.missed_days > 0, {class: "habit-check"} %>
          <%= check_box_tag nil, true, level.missed_days > 1, {class: "habit-check"} %>
          <%= check_box_tag nil, true, level.missed_days > 2, {class: "habit-check"} %>
       </p>
      <% end %>
    <% end %>
  </div>
</div>

habit.js

$(document).ready(function()
{
  $(".habit-check").change(function()
  {
    var submitUrl = $(this).parents("p").data("submit-url");
    var deleteUrl = $(this).parents("p").data("delete-url");

    if($(this).is(":checked"))
    {
       $.ajax(
       {
         url: submitUrl,
         method: "POST"
       })
       .done(function () {
         location.reload();
       });
    }
    else
    {
       $.ajax(
       {
         url: deleteUrl,
         method: "DELETE"
       })
       .done(function () {
         location.reload();
       });
    }
  });
});

days_missed_controller

class DaysMissedController < ApplicationController
  before_action :logged_in_user, only: [:create, :destroy]
  before_action :correct_user, only: [:create, :destroy]

  def create
    habit = Habit.find(params[:habit_id])
    habit.missed_days = habit.missed_days + 1
    @habit.save!
    level = habit.levels.find(params[:level_id])
    level.missed_days = level.missed_days + 1
    if level.missed_days == 3
      level.missed_days = 0
      level.days_lost += habit.calculate_days_lost + 2
    end
    level.save!
    head :ok # this returns an empty response with a 200 success status code
  end

  def destroy
    habit = Habit.find(params[:habit_id])
    habit.missed_days = habit.missed_days - 1
    @habit.save!
    level = habit.levels.find(params[:level_id])
    level.missed_days = level.missed_days - 1
    level.save!
    head :ok # this returns an empty response with a 200 success status code
  end

private

  def correct_user
    @habit = current_user.habits.find(params[:habit_id])
    redirect_to habits_path, notice: "Not authorized to edit this habit" if @habit.nil?
  end
end

第一张图片来自主页。这是两个按钮的代码:

<%= link_to '<span class="glyphicon glyphicon-ok"></span>'.html_safe, mark_completed_path(habit), remote: true, method: 'put', class: 'update_habit', id: 'home_check' %>
<%= link_to '<span class="glyphicon glyphicon-remove"></span>'.html_safe, habit_level_days_missed_index_path({ habit_id: @habit.id, level_id: level.id }), remote: true, method: 'put', class: 'habit-check' %>

我们怎样才能让第二个按钮起作用?这次尝试给了我undefined method 'id' for nil:NilClass

这是它的Gist

【问题讨论】:

  • 您从开发工具资源选项卡中的 ajax 得到什么响应?
  • 循环下有这些链接吗?那就试试&lt;%= link_to '&lt;span class="glyphicon glyphicon-remove"&gt;&lt;/span&gt;'.html_safe, habit_level_days_missed_index_path({ habit_id: habit, level_id: level.id }), remote: true, method: 'put', class: 'habit-check' %&gt;
  • 嗨@Pavan。您的代码给出:undefined local variable or method 'level' for #&lt;#&lt;Class:0x007fe6d0a42248&gt;:0x007fe6d6e3e080&gt;,所以我将级别设置为@level.id,但这给了undefined method 'level' for #&lt;Habit:0x007fe6cb970f18&gt;。我想我需要一种方法来重写我在显示页面中使用的这一行:&lt;% @habit.levels.each_with_index do |level, index| %&gt; 以移动到主页。感谢您的帮助!
  • 您的问题解决了吗?
  • 不,@Pavan 没用。尝试不同的东西。

标签: javascript ruby-on-rails ruby ajax model-view-controller


【解决方案1】:

您需要更改此链接

<%= link_to '<span class="glyphicon glyphicon-remove"></span>'.html_safe, habit_level_days_missed_index_path({ habit_id: @habit.id, level_id: level.id }), remote: true, method: 'put', class: 'habit-check' %>

<%= link_to '<span class="glyphicon glyphicon-remove"></span>'.html_safe, habit_level_days_missed_index_path({ habit_id: habit, level_id: habit.current_level }), remote: true, method: 'put', class: 'habit-check' %>

【讨论】:

猜你喜欢
  • 2016-03-12
  • 1970-01-01
  • 1970-01-01
  • 2018-10-05
  • 2020-10-18
  • 1970-01-01
  • 1970-01-01
  • 2017-05-04
相关资源
最近更新 更多