在Rails中使用link_to函数销毁/显示数组元素

时间:2015-09-18 15:45:58

标签: ruby-on-rails arrays postgresql

我有一个带有数组列的模型(“Product_list”),并希望当用户选择数组元素时 通过控制器删除/显示数组元素 在视图中。

* Delete将给出确认提示并从同一视图中删除所选的数组元素。

* Show将引导用户进入另一个页面,其中将显示与用户选择的数组元素相关联的另一个数据表中的产品详细信息)

我刚刚放了????????在link_to行中,因为我不知道我可以用于数组元素的路径。我还从控制器中排除了SHOW和DESTROY动作,因为我只是不知道该放在那里。

Index.html.erb

<% @product.product_list.each do |list| %>
  <%= link_to(list) do %>
  <div class="thumbnail">
    <div class="caption">
      <p><%= list %></p>
      <%= link_to 'Show Details', ????????? %>
      <%= link_to 'Destroy', ??????????, data: { confirm: 'Are you sure?' } %>
    </div>
  </div>
  <% end %>
<% end %>

Products_controller.rb

def index
  @product = Product.find(current_user.product)
  rescue ActiveRecord::RecordNotFound
end

def new
  @product = Product.new
end

def create
  @product = Product.new(product_params)
  @product.save
  Product.find_by_sql(["UPDATE products SET product_list = array_append(product_list, ?) WHERE user_id = ?", params[:product][:product_list], current_user]);
end

模型

create_table "products", force: :cascade do |t|
  t.string   "product_list", default: [], array: true
  t.integer  "user_id"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
end

add_index "products", ["user_id"], name: "index_products_on_user_id", using: :btree

2 个答案:

答案 0 :(得分:0)

尝试

<%= link_to 'Show Details', product_path(id: @product.id, array_element: list) %>
<%= link_to 'Destroy', product_path(id: @product.id, array_element: list), data: { confirm: 'Are you sure?' } %>

在你的控制器中显示和销毁,检查param:array_element。

答案 1 :(得分:0)

了解铁路路线

当您使用erb link_to方法时,您基本上创建了一个普通链接,与使用相同:

<a href="/"></a>

但是,不是指示正常的url路径(在普通链接的情况下,url目标位于href,你需要声明它是rails路径,你在routes.rb文件中声明rails路径。

如果您想知道您的rails路径是什么,则需要运行:

rake routes

在你的终端中,该命令将打印你当前的铁路路线。

以下是输出示例:

enter image description here

如您所见,URI模式是正常路径,但如果您看到前缀,则可以看到rails路径,例如:

new_user_session执行devise/sessions#new

/users/sign_in

要使用该rails路径,您需要包含&#34; path&#34;在前缀的末尾。

示例:

new_user_session_path

所以最终的结果是:

<%= link_to "Sign in", new_user_session_path %>

CRUD和控制器

CRUD代表创建阅读更新销毁

这些操作不言自明,您可以在控制器中编写它们。

例如,如果索引视图中有产品列表,那么这就是products_controller的代码:

def index
  @products = Product.all
end

并且您希望在索引中显示Product.all返回的每个元素(并存储在变量@products中),您只需在索引视图中将其写入:

<% @products.each do |f| %>
  <%= link_to "#{f.name}", f %>
  </br>
<% end %>

在上面的代码中,rails会自动识别您要转到ruby块中每个元素的实例,在本例中为f,因此您只需要编写f而不是prefix_path(还记得?)

现在,这将打印所有产品名称并使它们成为相应路径(url)的链接(感谢link_to),并显示@products变量的每个单个实例(已返回通过Product.all),您需要在products_controller.rb文件的show方法中编写以下代码:

def show
  @product = Product.find(params[:id])
end

将每个产品引用到正确的ID,(/ products / 1 / ... / 102 /)等等。

现在,当您点击每个实例时,它将呈现由其ID找到的相应产品(请参阅show方法),现在,如果您想要删除特定产品,那么它很简单,将此代码添加到您的products_controller:

def destroy
  @product = Product.find(params[:id])
  if @product.destroy
    flash[:notice] = "Product was deleted successfully."
    redirect_to products_path
  else
    flash[:error] = "There was an error deleting the product. Please try again."
    render :show
  end
end

注意:为了使flash消息有效,您需要在应用程序中启用它们,但因为它超出了问题的范围我不会现在就通过它。

正如您所看到的,代码是非常易读且不言自明的,当删除产品时,它会销毁它,显示flash消息然后呈现正确的路径。

在show.html.erb视图文件中,您需要使用以下代码才能删除记录(在本例中为产品,因为show方法会根据它返回产品的ID ),这是示例代码:

<%= "#{@product.name}" %>
</br>
<%= "#{@product.description}" %>

<%= link_to "Delete product", @product, method: :delete, class: 'btn btn-danger', data: { confirm: 'Are you sure you want to delete this product?' } %>

这将从数据库中销毁产品实例(如果单击该链接),因为这会触发products_controller中的destroy操作。

希望这有帮助!