根据模型实例调用控制器方法。轨道

时间:2014-09-11 14:37:30

标签: jquery ruby-on-rails

在我的程序中,我使用 gem' jquery-rails' ,我有两个控制器:

1。 CarsController。

2。 CarRoadsController

为了创建汽车,我在CarsController中创建方法,使用以下代码创建 create.js.erb 文件:

$("#todo-list").append("<%= j(render(@car)) %>");

我还有 index.html.erb 文件,其中有条件:

<% if @car %>
  <%= link_to(image_tag(road.image.url(:thumb)), car_roads_create_path, method: :post, remote: true) %>
<% else %>
  <%= link_to(image_tag(road.image.url(:thumb)), cars_create_path, method: :post, remote: true) %>
<% end %>

但是当我点击图片时,即使在创建@car之后,它总是会调用 Cars #crera

根据条件,我应该怎么做才能调用两种不同的方法?

2 个答案:

答案 0 :(得分:1)

如果您查看代码,请在index.html.erb中输入:

<% if @car %>
  // this statement will gets executed only when you have @car set in index action of cars controller
  <%= link_to(image_tag(road.image.url(:thumb)), car_roads_create_path, method: :post, remote: true) %>
<% else %>
  // this statement will gets executed when you don't have @car index action of cars controller
  <%= link_to(image_tag(road.image.url(:thumb)), cars_create_path, method: :post, remote: true) %>
<% end %>

在您的索引操作中,您没有设置@car,因此它总是会让您让汽车创建操作。

现在让我们看看你在create.js.erb中的代码,你有:

$("#todo-list").append("<%= j(render(@car)) %>");

此代码在您的索引操作中未设置@car,它只是shorthand to render a partial with instance variable。它使用id =&#34; todo-list&#34;更改元素内的内容。通过在部分_car.html.erb中附加代码并在该部分中传递@car变量

<强> FIX:

要解决您的问题,您需要更改create.js.erb中的链接,如下所示:

#index.html.erb
<div id="create-link">
  <%= link_to(image_tag(road.image.url(:thumb)), cars_create_path, method: :post, remote: true) %>
</div>

#_create_road_car.html.erb
<%= link_to(image_tag(road.image.url(:thumb)), car_roads_create_path, id: "roads_create") %>

#create.js.erb
$("#todo-list").append("<%= j(render(@car)) %>");
$("#create-link").html("<%=j render partial: "create_road_car", locals: {road: @your_road_variable}  %>");

<强>更新

根据我们的聊天情况,你可以这样做:

#index.html.erb
<div id="create-link">
  <%= link_to(image_tag(road.image.url(:thumb)), cars_create_path(road: road), method: :post, remote: true) %>
</div>

#car_roads_controller.rb
def create
  #other code
  @road = params[:road]
end

#create.js.erb
$("#todo-list").append("<%= j(render(@car)) %>");
$("#create-link").html("<%=j render partial: "create_road_car", locals: {road: @road}  %>");

答案 1 :(得分:0)

您正在通过link_to进行发布...取决于您的路线设置方式,您可能无法访问您尝试前往的路线。

您可以在config / routes.rb中向我们展示您为这些链接设置的路线吗?

您使用link_to提交表单吗?如果是这样,你应该使用jquery这样做,通过为你的表单和链接分配id,如下所示:

<% if @car %>
  <%= link_to(image_tag(road.image.url(:thumb)), car_roads_create_path, id: "roads_create") %>
<% else %>
  <%= link_to(image_tag(road.image.url(:thumb)), cars_create_path, id: "car_create") %>
<% end %>

<script type='text/javascript'>
  $("#roads_create").click(function(){
    $("#road_create_form").submit();
  });
  $("#car_create").click(function(){
    $("#car_create_form").submit();
  });
</script>

另一方面,如果您没有要提交的表单,则应使用带有link_to参数的GET请求来传递数据。

如果您提供更多信息,我们可以提供更详细的帮助。