我有一个带有数组列的模型(“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
答案 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
在你的终端中,该命令将打印你当前的铁路路线。
以下是输出示例:
如您所见,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代表创建,阅读,更新和销毁。
这些操作不言自明,您可以在控制器中编写它们。
例如,如果索引视图中有产品列表,那么这就是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操作。
希望这有帮助!